所有行的 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 条件比较列
我有两个这样的 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 条件比较列