Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将组中的行与合并_Sql - Fatal编程技术网

Sql 如何将组中的行与合并

Sql 如何将组中的行与合并,sql,Sql,我有一个场景,需要通过比较不同的列来合并行 下面是一个复杂联接的结果示例 输入 keycolumn val1 val2 a abc a xyz a abc a xyz a pqr 期望结果 keycolumn val1 val2 a

我有一个场景,需要通过比较不同的列来合并行

下面是一个复杂联接的结果示例

输入

keycolumn       val1     val2
  a             abc      
  a             xyz      
  a                       abc
  a                       xyz
  a             pqr
期望结果

keycolumn        val1     val2
  a               abc      abc
  a               xyz      xyz
  a               pqr

我想看看是否可以在不使用join的情况下获得所需的结果

您可以使用self-
左join
匹配
keycolumn
val1/val2
元组的表,并使用
DISTINCT
COALESCE()
打印相关值:

SELECT DISTINCT
    t1.keycolumn,
    COALESCE(t1.val1, t2.val1) val1, 
    COALESCE(t1.val2, t2.val2) val2
FROM mytable t1
LEFT JOIN mytable t2 
    ON t1.keycolumn = t2.keycolumn 
    AND (t1.val1 = t2.val2 OR t1.val2 = t2.val1)

| keycolumn | val1 | val2 |
| --------- | ---- | ---- |
| a         | abc  | abc  |
| a         | xyz  | xyz  |
| a         | pqr  |      |

您可以使用
union all
group by

select keycolumn, max(val1) as val1, max(val2) as val2
from ((select t.keycolumn, t.val1, null as val2, row_number() over () as seqnum
       from t
       where val1 is not null
      ) union all
      (select t.keycolumn, null as val1, t.val2, row_number() over () as seqnum
       from t
       where val2 is not null
      )
     ) t
group by keycolumn, seqnum
order by keycolumn, seqnum;
他是一把小提琴。根据数据库的不同,对于
行号()
(db fiddle使用Postgres,不需要
order by
),您可能需要
order by

您可以尝试以下方法:

select t1.keycolumn, t1.val1,
    (select t2.val2 from table1 t2 where t2.keycolumn = t1.keycolumn and t2.val2 = t1.val1)
from table1 t1
where t1.val1 is not null

我们如何判断哪些记录应分组在一起?应使用keycolumn进行分组,如果一条记录中的val1值位于另一条记录的val2列中,或者反之亦然,则它们应显示为单个记录,而不是2条记录。如果不存在相应的记录,我们该怎么办?如果不存在记录,则相应的值将为null,但这两列中的一列将始终有一个值。