Sql 两个查询如何将两个查询合并到一个结果集中而不重复?
我有一个表,有三列id,name,training\u run\u id,name\u entity\u id。 我想用两个名称列创建结果集,但类型不同Sql 两个查询如何将两个查询合并到一个结果集中而不重复?,sql,h2,Sql,H2,我有一个表,有三列id,name,training\u run\u id,name\u entity\u id。 我想用两个名称列创建结果集,但类型不同 SELECT r1.id, r1.f1, r2.id, r2.f1 FROM ( SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13 GROUP BY ID ) as r1 J
SELECT r1.id, r1.f1, r2.id, r2.f1 FROM
(
SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13
GROUP BY ID
) as r1
JOIN
(
SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (3,4) AND NAMED_ENTITY_ID = 13
GROUP BY ID
) as r2
查询结果如下:
id f1 training_run_id id f1 training_run_id
27 0.3 2 41 0.5 3
27 0.3 2 55 0.66 4
13 0.2 1 41 0.5 3
13 0.2 1 55 0.66 4
我想知道如何得到这个:
id f1 training_run_id id f1 training_run_id
13 0.2 1 41 0.5 3
27 0.3 2 55 0.66 4
您可以使用Qualify语句。我刚刚使用了您的代码来创建上面的表。然后,您可以按R1.ID对数据进行分区,这将把所有数据分割成用户ID上的分区,然后按R2 ID降序排列,然后按Row_number()=1对语句进行限定,这将采用分区内最低的R2.ID编号,并删除其余结果
SELECT r1.id, r1.f1, r2.id, r2.f1 FROM
(
SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13
GROUP BY ID
) as r1
JOIN
(
SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (3,4) AND NAMED_ENTITY_ID = 13
GROUP BY ID
) as r2
QUALIFY (ROW_NUMBER () OVER (PARTITION BY R1.ID ORDER BY R2.ID ASC)) = 1
几个假设(基于OP的评论):
- 您的两个子查询始终具有匹配的行计数
- 行如何匹配并不重要
rownum
,这样您就可以加入其中,以避免笛卡尔计划:
SELECT r1.id, r1.f1, r2.id, r2.f1 FROM
(
SELECT rownum as rn, id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13
GROUP BY ID
) as r1
JOIN
(
SELECT rownum as rn, id, f1 from RESULT where TRAINING_RUN_ID IN (3,4) AND NAMED_ENTITY_ID = 13
GROUP BY ID
) as r2
ON r1.rn = r2.rn
编辑
实际上,不太确定上面的操作是否正确,因为在有关的文档中指定,rownum
似乎是在groupby
之前计算的
要在排序和分组后获取行号,请使用子查询
如果是这样,我认为这是正确的查询:
SELECT r1.id, r1.f1, r2.id, r2.f1 FROM
(
select rownum() as rn, id, f1
from (
SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (1,2) AND NAMED_ENTITY_ID = 13
GROUP BY ID
) t
) as r1
JOIN
(
select rownum() as rn, id, f1
from (
SELECT id, f1 from RESULT where TRAINING_RUN_ID IN (3,4) AND NAMED_ENTITY_ID = 13
GROUP BY ID
) t
) as r2
ON r1.rn = r2.rn
h2是否支持row_number()?@Serg是,h2支持该函数id 13与id 41之间的关系。例如,为什么不在同一行上合并13和55?这里有规则吗?@trincot我没有添加列training\u run\u id,现在更新了,我想更清楚了如果第一个子查询返回2个结果,第二个子查询返回3个结果,那么预期的结果会是什么?这个问题背后的逻辑还不清楚。我不认为H2支持windows函数,比如(
row_number())over(partitionby…)
。这项功能是最近添加的吗?或者你使用了另一个数据库?我的坏消息我注意到eugenn说H2支持上面的行号()谢谢,如果从查询中删除“GROUP BY ID”就可以了!