SQL中交集的补码
我正在使用Oracle SQL,我有一个关于join命令的基本问题 我有五张桌子。它们中的每一个都有与主键相同的列:ID int。让我们看看以下查询:SQL中交集的补码,sql,oracle,join,intersection,Sql,Oracle,Join,Intersection,我正在使用Oracle SQL,我有一个关于join命令的基本问题 我有五张桌子。它们中的每一个都有与主键相同的列:ID int。让我们看看以下查询: select count(*) from table_a - 100 records select count(*) from table_c - 200 records select count(*) from table_c - 150 records select count(*) from table_d - 100 records se
select count(*) from table_a - 100 records
select count(*) from table_c - 200 records
select count(*) from table_c - 150 records
select count(*) from table_d - 100 records
select count(*) from table_e - 120 records
在这种情况下,如果其中一个表不包含特定ID,则许多记录无法包含在输出中,即使其他记录也包括在内。我怎么知道这些坏记录是什么?我想它实际上是交叉口的补充
我想知道每个案例的问题记录和表格是什么。例如:ID123是一个坏记录,因为它不包含在表c中,但包含在其余的表中。ID 321是一个有问题的记录,因为它包含在除表d之外的所有表中。尝试以下操作:
SELECT id FROM (
SELECT id FROM table_a
UNION
SELECT id FROM table_b
UNION
SELECT id FROM table_c
UNION
SELECT id FROM table_d
UNION
SELECT id FROM table_e
) result
WHERE id NOT IN ( select a.id from table_a a
inner join table_b b
on a.id = b.id
inner join table_c c
on a.id = c.id
inner join table_d d
on a.id = d.id
inner join table_e e
on a.id = e.id )
您可以尝试以下查询
SELECT id, COUNT(id) as id_num FROM (
SELECT id FROM table_a
UNION
SELECT id FROM table_b
UNION
SELECT id FROM table_c
UNION
SELECT id FROM table_d
UNION
SELECT id FROM table_e
)
GROUP BY id HAVING id_num <5
如果我理解正确,您可以使用外部联接来确定哪些行没有匹配的主键或唯一键。例如,在以下示例中,使用左联接查找表b中不匹配的行:
select a.id from a left join b on a.id=b.id where b.id is null
相反,要查找表a中不匹配的行,请执行以下操作:
select b.id from a right join b on a.id=b.id where a.id is null
此解决方案将告诉您哪些表缺少每个ID的行:
您可能正在查找所有桌子之间的位置 要在不太聪明的情况下解决此类问题,您需要: 完全外部联接将返回与普通联接一样满足联接条件的所有行以及没有相应行的所有行。USING子句在equijoin列上嵌入隐式合并 另一种选择是使用: 基本上,这将构建所有集合的并集减去所有集合的交集 从图形上看,仅为了便于表示,您可以比较3个表上的内部联接和外部联接: 考虑到该测试用例: *表中的值-缺少条目 两个查询都将生成:
ID
1
3
2
如果您想要表格化的结果,您可以通过添加一组CASE表达式来调整其中一个查询。诸如此类:
SELECT ID,
CASE when table_a.rowid is not null then 1 else 0 END table_a,
CASE when table_b.rowid is not null then 1 else 0 END table_b,
CASE when table_c.rowid is not null then 1 else 0 END table_c,
CASE when table_d.rowid is not null then 1 else 0 END table_d,
CASE when table_e.rowid is not null then 1 else 0 END table_e
FROM table_a
FULL OUTER JOIN table_b USING(id)
FULL OUTER JOIN table_c USING(id)
FULL OUTER JOIN table_d USING(id)
FULL OUTER JOIN table_e USING(id)
WHERE table_a.ROWID IS NULL
OR table_b.ROWID IS NULL
OR table_c.ROWID IS NULL
OR table_d.ROWID IS NULL
OR table_e.ROWID IS NULL;
制作:
表0中的1值缺少条目
很抱歉,我之前没有说过,但我想知道每个案例的问题记录和表格是什么。例如:ID123是一个坏记录,因为它不包含在表c中,但包含在其余的表中。ID321是一个有问题的记录,因为它包含在除表d之外的所有表中。我刚刚编辑了我的问题并进行了解释。嘿,我提供了一个不在每个表中的ID列表。玩吧。提示:从表a中选择id,“错误id”,其中id不是。。。德国劳埃德船级社!您的查询运行的时间太长。我的数据很大,每个表有60k条记录。上面的数字只是一个例子。实数约为60k。我知道,但它会给我两个特定表格之间的差异。我需要把所有桌子的区别放在一起。如果我尝试在所有表之间使用left-join,为了找出差异,它会给出一个表与其他表之间的差异,我需要将所有表之间的差异放在一起。我希望我已经够清楚了,也许我错了。谢谢。我明天试试。我现在必须离开办公室了。我刚试过。您的查询只提供了约300条记录,而Sylvain Leroux查询提供了约11k条记录,这是一个更合理的数字。知道为什么吗?在我创建的示例数据中,Sylvain的所有查询都提供了与我的查询相同的行数。我不知道你的数据会有什么不同,会导致结果不同。我只是尝试过。您的查询提供了合理的输出。谢谢有机会像Allan那样输出吗?@user3928712事实上,我昨天主要是为了构建示例表而做的。我已经把它复制到了答案中。谢谢。工作得很好!
ID | TABLE_A | TABLE_B | TABLE_C | TABLE_D | TABLE_E
0 | 1 | 0 | 0 | 1 | 0
1 | 0 | 1 | 0 | 1 | 0
2 | 1 | 1 | 0 | 0 | 0
SELECT id
FROM table_a
FULL OUTER JOIN table_b USING(id)
FULL OUTER JOIN table_c USING(id)
FULL OUTER JOIN table_d USING(id)
FULL OUTER JOIN table_e USING(id)
WHERE table_a.ROWID IS NULL
OR table_b.ROWID IS NULL
OR table_c.ROWID IS NULL
OR table_d.ROWID IS NULL
OR table_e.ROWID IS NULL;
SELECT id
FROM table_a
FULL OUTER JOIN table_b USING(id)
FULL OUTER JOIN table_c USING(id)
FULL OUTER JOIN table_d USING(id)
FULL OUTER JOIN table_e USING(id)
WHERE id NOT IN (
SELECT id
FROM table_a
INNER JOIN table_b USING(id)
INNER JOIN table_c USING(id)
INNER JOIN table_d USING(id)
INNER JOIN table_e USING(id)
)
ID TABLE_A TABLE_B TABLE_C TABLE_D TABLE_E
1 * - - - -
2 - * * * *
3 * - - * -
4 * * * * *
ID
1
3
2
SELECT ID,
CASE when table_a.rowid is not null then 1 else 0 END table_a,
CASE when table_b.rowid is not null then 1 else 0 END table_b,
CASE when table_c.rowid is not null then 1 else 0 END table_c,
CASE when table_d.rowid is not null then 1 else 0 END table_d,
CASE when table_e.rowid is not null then 1 else 0 END table_e
FROM table_a
FULL OUTER JOIN table_b USING(id)
FULL OUTER JOIN table_c USING(id)
FULL OUTER JOIN table_d USING(id)
FULL OUTER JOIN table_e USING(id)
WHERE table_a.ROWID IS NULL
OR table_b.ROWID IS NULL
OR table_c.ROWID IS NULL
OR table_d.ROWID IS NULL
OR table_e.ROWID IS NULL;
ID TABLE_A TABLE_B TABLE_C TABLE_D TABLE_E
1 1 0 0 0 0
3 1 0 0 1 0
2 0 1 1 1 1