所有行的 Where 子句在表之间匹配

Where clause for all rows matches between tables

我有两个这样的 table:

table1                       table2

id  COL1    COL2        id  COL1    COL2
1   1   2               1   1         2
1   3   4               1   3         4
1                       1   5         6
1                       2   7         8
2   1   2               2   1         2
2   3   4               2   3         4
2   5   6               2   5         6
2   7   8               2   7         8

我想找到与第二个 table

匹配的所有行的 ID

当我在 hana 中查询时,我得到了两个 ID

因为只有一个 ID,即 2 与第二个 table 匹配所有行,我期待 ID 2。

我尝试了所有连接。请帮助我。

您可以使用 join 来获取两个表之间的匹配行。然后按 id 聚合并验证计数是否匹配:

select t1.id
from table1 t1 join
     table2 t2
     on t1.id = t2.id and t1.col1 = t2.col1 and t1.col2 = t2.col2
group by t1.id
having count(*) = (select count(*) from table1 tt1 where tt1.id = t1.id) and
       count(*) = (select count(*) from table2 tt2 where tt2.id = t1.id);

另一种方法是使用 union all 和聚合:

select id
from (select id, col1, col2, 1 as from1, NULL as from2 from table1 union all
      select id, col1, col2, NULL, 1 table2
     ) t
group by id
having count(*) = sum(from1) and
       count(*) = sum(from2);

我会查找表 2 中缺少记录的 ID,然后 return 不在该列表中的 ID 列表:

SELECT DISTINCT table1.id
FROM table1 table1
WHERE table1.id NOT IN (
        SELECT t1.id
        FROM table1 t1
        LEFT JOIN table2 t2 ON t1.id = t2.id
            AND t1.col1 = t2.col1
            AND t1.col2 = t2.col2
        WHERE t2.id IS NULL
        )
SELECT *
FROM Table1 t1
WHERE NOT EXISTS (SELECT *
                  FROM Table1 t11
                  WHERE t1.id = t11.id 
                  EXCEPT 
                  SELECT *
                  FROM Table2 t2
                  WHERE t2.id = t1.id AND t2.COL1=t1.COL1 AND t2.COL2=t1.COL2)

这里的技巧是您找到 table1 中的所有记录并从 table2 中减去(使用 EXCEPT)它们。现在,所有字段都与 table2 匹配的 id 将 return 变成 NULL,因此 NOT EXISTS 将为您 return 这条记录。

我是通过 id 使用字符串聚合组完成的。

之后我使用 Id 条件比较列