mysql 找到匹配ID时,填充相同的列

tquggr8v  于 10个月前  发布在  Mysql
关注(0)|答案(2)|浏览(102)

如果多个条目具有相同的ID(tag_num),我希望列相同。例如,如果一行可能具有说明,而另一行为null,但两者具有相同的ID(tag_num),我希望将说明也复制到null行。
之前:

--------------------------------------
| tag_num |  description  | category |
--------------------------------------
|    1    | Description A |     A    |
|    1    |               |          |
|    2    | Description B |     B    |
|    2    | Description B |     B    |
|    2    | Description B |          |
|    3    | Description C |          |
|    3    |               |          |
--------------------------------------

字符串
预期输出:

--------------------------------------
| tag_num |  description  | category |
--------------------------------------
|    1    | Description A |     A    |
|    1    | Description A |     A    |
|    2    | Description B |     B    |
|    2    | Description B |     B    |
|    2    | Description B |     B    |
|    3    | Description C |          |
|    3    | Description C |          |
--------------------------------------


这是我到目前为止(为mySQL)编写的SQL,但我被难倒了:

SELECT * FROM table
WHERE tag_num IN (
    SELECT tag_num
    FROM table
    GROUP BY tag_num
    -- update empty columns here where columns are empty
)

laawzig2

laawzig21#

假设你使用的是Mysql 8+,一个窗口化的聚合是一个可能的解决方案:

select tag_num,
    Coalesce(description, Max(description) over(partition by tag_num)) description,
    Coalesce(category, Max(category) over(partition by tag_num)) category
from t;

字符串

llycmphe

llycmphe2#

如果你可以使用解析函数,那么就使用它们(正如Stu所说的;尽管如此,因为所有的值都应该是一样的,也许你不必 * 检查 * 某个值是否为NULL):

SQL> select tag_num,
  2    max(description) over (partition by tag_num) description,
  3    max(category) over (partition by tag_num) category
  4  from test
  5  order by tag_num;

   TAG_NUM DESCRIPTION  CATEGORY
---------- ------------ ------------
         1 desc A       A
         1 desc A       A
         2 desc B       B
         2 desc B       B
         2 desc B       B
         3 desc C
         3 desc C

7 rows selected.

字符串
或者,在子查询中查找目标值并将其连接到源数据。此选项不如以前好,因为您必须查询同一个表两次,因此如果处理大型表,性能可能会受到影响;但是,您不会注意到小型表的任何差异。

SQL> select a.tag_num, b.description, b.category
  2  from test a join (select tag_num,
  3                           max(description) description,
  4                           max(category)    category
  5                    from test
  6                    group by tag_num
  7                   ) b on a.tag_num = b.tag_num
  8  order by a.tag_num;

   TAG_NUM DESCRIPTION  CATEGORY
---------- ------------ ------------
         1 desc A       A
         1 desc A       A
         2 desc B       B
         2 desc B       B
         2 desc B       B
         3 desc C
         3 desc C

7 rows selected.

SQL>

相关问题