2008-09-29 44 views
6

选择联盟:什么是标准SQL查询来检索交集表?

select * from table1 
union 
select * from table1_backup 

什么是查询选择交集?

+0

交叉口基于每场或只是键? – 2008-09-29 14:08:14

+0

你使用的是SQL Server 2005还是其他一些DBMS? – 2008-09-29 14:13:41

+0

尝试跨越db兼容。主要关注MySQL和SQLServer。 – 2008-09-29 14:17:35

回答

8

在SQL Server intersect

select * from table1 
intersect 
select * from table1_backup 
+0

拍摄,所以这只是一个SQL Server的答案,有没有SQL Server/MySQL跨数据库查询? – 2008-09-29 14:10:08

+1

根据2005年的博客文章和listservs,我在google上发现,MySQL不支持直接相交记法,而是建议使用Inner Joins或子查询。 – 2008-09-29 14:13:47

+1

该问题没有说明MySQL解决方案是必需的。 请注意,兴趣也是一种隐含的DISTINCT(与UNION和MINUS相同) – 2008-09-29 15:38:27

1

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

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

+0

联合非常有用,因为它不会添加额外的字段。它使用时将两个表视为同一个表。我想要的是同样的东西,除非我希望我能够看到哪些记录完全相同,以防备份在运行备份时出现混乱。 – 2008-09-29 14:12:13

1

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

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

-4
select distinct * from (select * from table1 union select * from table1_backup) 
6
SELECT * 
FROM table1 
WHERE EXISTS 
(SELECT * 
FROM table1_backup 
WHERE table1.pk = table1_backup.pk) 

工作

1

这里是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,其中引用元素表的PRIMARY KEY,超集(表示花括号中数字的可能值)。对于那些没有数学倾向的人,让我们假装你有一个表,'other_table',它是一个项目列表,另一个表'another_table'是一个事务号列表,而这两个表格形成一个多对多多少关系,从而产生'table1'。现在让我们假装你想知道id为'another_table'中的项目1,2和3,这就是查询。

-1

子查询?真?

得到表1和表2的交叉点:

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

的交叉上的两个相同的表A和B可以以这种方式来完成:

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