Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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_H2 - Fatal编程技术网

Sql 两个查询如何将两个查询合并到一个结果集中而不重复?

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

我有一个表,有三列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
    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”就可以了!