2008-09-29 71 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)