检索表交集的标准 SQL 查询是啥?

Posted

技术标签:

【中文标题】检索表交集的标准 SQL 查询是啥?【英文标题】:What is the standard SQL Query to retrieve the intersection of tables?检索表交集的标准 SQL 查询是什么? 【发布时间】:2010-09-14 00:14:22 【问题描述】:

选择联合:

select * from table1 
union 
select * from table1_backup 

选择交叉点的查询是什么?

【问题讨论】:

基于每个字段或仅键的交集? 您使用的是 SQL Server 2005 还是其他一些 DBMS? 尝试跨数据库兼容。主要关注 mysql 和 SQLServer。 【参考方案1】:

在 SQL Server 中intersect

select * from table1 
intersect
select * from table1_backup

【讨论】:

开枪,所以这只是一个 SQL Server 的答案,没有 SQL Server/MySQL 跨数据库查询吗? 根据我在 google 上发现的 2005 年的博客文章和 listservs,MySQL 不支持直接相交表示法,而是建议使用内连接或子查询。 该问题并未说明需要 MySQL 解决方案。请注意,兴趣也是隐含的 DISTINCT(与 UNION 和 MINUS 相同)【参考方案2】:
SELECT *
FROM table1
WHERE EXISTS
(SELECT *
FROM table1_backup
WHERE table1.pk = table1_backup.pk)

作品

【讨论】:

这看起来是一个不错的答案,但不像我接受的那样抽象。它可能也更快。 就我而言,我不需要 where 子句。 你需要一个 WHERE 子句,否则它没有意义。如果 table1_backup 中存在任何行,您将只返回 table1 中的所有行。否则你会得到零行。【参考方案3】:

对于这样的问题,我倾向于回到这个视觉资源:

A Visual Explanation of SQL Joins

【讨论】:

【参考方案4】:

我认为内部连接: 假设 T1 和 T2 具有相同的结构:

从 T1.* 中选择 T1 内连接 T2 在 T1.pkField = T2.pkField

【讨论】:

联合很有用,因为它不会添加额外的字段。它在使用时将两个表视为同一个表。我想要同样的东西,除了我想看看哪些记录是完全相同的,以防在运行备份时出现问题。【参考方案5】:

“相交”也是标准 SQL 的一部分。

内连接给出了不同的答案。

【讨论】:

那么查询是什么? select * from table1 intersect select * from table2 在 mysql 中给我一个错误【参考方案6】:

这里有一个针对 mySQL 的解决方案:

CREATE TABLE table1(
id INT(10),
fk_id INT(10),
PRIMARY KEY (id, fk_id),
FOREIGN KEY table1(id) REFERENCES another_table(id),
FOREIGN KEY table1(fk_id) REFERENCES other_table(id)
);

SELECT table1.* FROM table1 as t0
INNER JOIN table1 as a ON (t0.id = a.id and fk_id=1)
INNER JOIN table1 as b ON (t0.id = b.id and fk_id=2)
INNER JOIN table1 as c ON (t0.id = c.id and fk_id=3)
ORDER BY table1.id;

基本上你有一个数学子集表(即 1=1, 2 ,3, 2=3, 4, 2, ... , n=1, 4, 7)属性 id 是集合编号,fk_id 引用元素表的主键,即超集(表示大括号中数字的可能值)。对于那些不喜欢数学的人,让我们假设你有一个表,'other_table',它是一个项目列表,还有另一个表,'another_table',它是一个事务号列表,两个表形成一个多对-many 关系,从而产生'table1'。现在让我们假设您想知道 'another_ table' 中包含项目 1、2 和 3 的 id。这就是执行此操作的查询。

【讨论】:

【参考方案7】:

可以用这种方式在两个相同的表 a 和 b 上进行相交:

SELECT a.id, a.name
FROM a INNER JOIN b
USING (id, name)

【讨论】:

【参考方案8】:

子查询?!真的吗?

获取table1和table2的交集:

SELECT * FROM table1, table2 WHERE table1.pk=table2.pk;

【讨论】:

那不是交集,那只是一个连接。联合使用两个相同的数据集,我正在寻找一个相关的功能。你是对的,你可以加入每个领域。 -1 只是为了徒劳地使用主的名字。【参考方案9】:
select distinct * from (select * from table1 union select * from table1_backup) 

【讨论】:

太好了,这是我要找的查询,*** 很棒,只用了 5 分钟,比 Google-ing 有趣多了。这个答案在各个方面对我来说都是完美的,除了它需要在最后有“as table_x”才能在我的 SQL 版本中不出现密钥冲突。 这不返回相交...它返回每个表中的每一行,并过滤掉重复项。

以上是关于检索表交集的标准 SQL 查询是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在具有多个表的 sqlite 数据库中检索链接对象列表的查询是啥?

在sql中检索帖子“喜欢”的有效方法是啥?

使用查询从 sql 视图中检索引用表的列表

Oracle全文检索是啥意思?

SQL查询从链接表中检索最后一条记录[重复]

用于从多个表中检索数据的 Sql 查询