检索表交集的标准 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 查询是啥?的主要内容,如果未能解决你的问题,请参考以下文章