2008-09-29 24 views
6

Chọn liên minh:Truy vấn SQL chuẩn để truy xuất giao điểm của bảng là gì?

select * from table1 
union 
select * from table1_backup 

Truy vấn để chọn giao lộ là gì?

+0

Intersection dựa trên tất cả các lĩnh vực hay chỉ là Chìa khóa? –

+0

Bạn đang sử dụng SQL Server 2005 hoặc một số DBMS khác? –

+0

Đang cố gắng tuân thủ cross-db. Chủ yếu tập trung vào MySQL và SQLServer. –

Trả lời

8

Trong SQL Server intersect

select * from table1 
intersect 
select * from table1_backup 
+0

Quay, do đó, đó chỉ là câu trả lời của SQL Server, không có truy vấn chéo qua SQL Server/MySQL? –

+1

Theo bài đăng trên blog và danh sách từ năm 2005 tôi tìm thấy trên google, MySQL không hỗ trợ ký hiệu giao nhau thẳng, và thay vào đó đề xuất Tham gia bên trong hoặc truy vấn phụ. –

+1

Câu hỏi không nêu rõ rằng một giải pháp MySQL là bắt buộc. Xin lưu ý rằng Sở thích cũng là một DISTINCT tiềm ẩn (giống như UNION và MINUS) –

1

bên tham gia tôi nghĩ rằng: T1 giả sử và T2 có cấu trúc giống nhau:.

chọn T1 * từ T1 bên tham gia T2 trên T1 .pkField = T2.pkField

+0

Công đoàn rất hữu ích vì nó không thêm một trường bổ sung. Nó xử lý hai bảng giống như bảng khi được sử dụng.Tôi muốn điều tương tự, ngoại trừ tôi muốn tôi để xem hồ sơ nào là chính xác như nhau trong trường hợp một cái gì đó sai lầm trong chạy một bản sao lưu. –

1

"giao nhau" cũng là một phần của SQL chuẩn.

Kết nối bên trong đưa ra một câu trả lời khác.

+0

Vậy truy vấn sẽ là gì? select * from table1 intersect select * from table2 cho tôi một lỗi trong mysql –

-4
select distinct * from (select * from table1 union select * from table1_backup) 
+0

Tuyệt vời, đây là truy vấn tôi đang tìm kiếm, stackoverflow thật tuyệt vời, chỉ mất 5 phút và thú vị hơn nhiều so với Google-ing. Câu trả lời này là hoàn hảo cho tôi theo mọi cách ngoại trừ nó cần phải có "như table_x" ở cuối để không nhận được một sự vi phạm chính trong phiên bản SQL của tôi. –

+0

Điều này không trả về giao lộ ... nó trả về mọi hàng trong mỗi bảng và lọc ra các bản sao. –

+0

Phải, tôi mới nhận ra điều đó. Không được chấp nhận! –

6
SELECT * 
FROM table1 
WHERE EXISTS 
(SELECT * 
FROM table1_backup 
WHERE table1.pk = table1_backup.pk) 

làm việc

+0

Điều này giống như một câu trả lời hay, nhưng không trừu tượng như câu trả lời tôi chấp nhận. Nó có lẽ cũng nhanh hơn. –

+0

Vì mục đích của tôi, tôi không cần mệnh đề where. –

+2

Bạn cần một điều khoản WHERE nếu không nó không có ý nghĩa. Bạn sẽ chỉ trả về tất cả các hàng từ table1 nếu có bất kỳ hàng nào tồn tại trong table1_backup. Nếu không, bạn sẽ nhận được 0 hàng. – beach

1

đây là một giải pháp cho 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; 

Về cơ bản, bạn có một bảng các tập con toán học (ví dụ: 1 = {1, 2, 3}, 2 = {3, 4, 2}, ..., n = {1, 4, 7}) với id thuộc tính, là số tập hợp và id fk_, tham chiếu một khóa CHÍNH của một bảng các phần tử, phần tử siêu lớn (có nghĩa là các giá trị có thể cho các số trong các dấu ngoặc nhọn). Đối với những người không nghiêng về mặt toán học, giả sử bạn có một bảng, 'other_ table', là một danh sách các mục và một bảng khác, 'another_ table', là danh sách các số giao dịch và cả hai bảng tạo thành nhiều -many mối quan hệ, do đó sản xuất 'table1'. bây giờ chúng ta hãy giả vờ bạn muốn biết id trong 'another_ table' có các mục 1, 2 và 3. đó là truy vấn để làm điều đó.

-1

truy vấn con ?! có thật không?

để có được những giao điểm của table1 và table2:

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

Đó không phải là giao lộ, đó chỉ là sự tham gia. Các công đoàn làm việc với hai bộ dữ liệu giống hệt nhau, tôi đang tìm kiếm một hàm liên quan. Bạn nói đúng, bạn có thể tham gia vào từng lĩnh vực. -1 là chỉ để sử dụng tên của Chúa vô ích. –

0

Một giao nhau trên hai bảng giống hệt nhau a và b có thể được thực hiện theo cách này:

SELECT a.id, a.name 
FROM a INNER JOIN b 
USING (id, name) 
Các vấn đề liên quan