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

How two merge two queries into one result set without duplicates?

我有一个 table,其中包含三列 id、name、training_run_id、named_entity_id。 我想用两个名称列创建结果集,但 type_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

您可以使用限定语句。我刚刚使用您的代码创建了上面的 table。然后,您可以按 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 的评论):

  • 你的 2 个子查询总是有匹配的行数
  • 如何匹配行并不重要

如果上述情况属实,我认为您可以简单地让每个子查询 return 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 function 的文档中所指定的那样,rownum 似乎被计算 之前 group by.

To get the row number after ordering and grouping, use a subquery.

如果是这样,我认为这是正确的查询:

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