2008-12-09 30 views
9

Tôi có bốn bảng chứa chính xác cùng một cột và muốn tạo chế độ xem trên tất cả bốn cột để tôi có thể truy vấn chúng cùng nhau.Xem trên nhiều bảng chứa cùng một cột

Điều này có khả thi không?

(vì lý do tẻ nhạt tôi không thể/đang không được phép kết hợp chúng, mà sẽ làm cho điều này không liên quan!)

+0

bạn đang sử dụng máy chủ cơ sở dữ liệu nào? – ysth

+0

Tôi không chắc chắn về thiết lập chính xác của bạn, nhưng nếu bạn có 4 bảng trùng lặp mà bạn muốn truy vấn với một liên kết, một bảng có cột loại có thể có ý nghĩa hơn. Trừ khi tất nhiên hệ thống đã tồn tại hoặc có những yếu tố khác. –

Trả lời

15

Giả sử rằng ngoài việc có những cái tên cùng một cột, các cột của cùng chứa cùng một dữ liệu, bạn muốn tạo một cái nhìn đó là sự kết hợp của tất cả những những cái bàn.

giống như sau nên làm việc, nhưng SQL của tôi là Rusty:

(CREATE VIEW view_name AS 
(SELECT * FROM table1 
UNION 
SELECT * FROM table2 
UNION 
SELECT * FROM table3)); 
+0

UNION được sử dụng để kết hợp kết quả từ nhiều câu lệnh SELECT thành một tập kết quả duy nhất. –

2

Sử dụng các tuyên bố liên minh

select * from table1 
union 
select * from table2 
union 
select * from table3 
2

Bạn có thể nếu bạn kết hợp chúng (tôi sẽ đề nghị bao gồm một số chỉ số như mà bảng mỗi bản ghi đến từ):

select table1.column1, 1 as TableNumber 
from  table1 

union 

select table2.column1, 2 as TableNumber 
from  table2 

.. etc .. 
12

Có thể đáng lưu ý rằng bạn có thể cần phải sử dụng "union all" để lưu giữ các hàng duy nhất có thể tồn tại ở nhiều hơn một trong các bảng. Một liên minh tiêu chuẩn sẽ loại bỏ các bản sao.

+0

Cảm ơn - đã cố gắng để xem tại sao một số hàng đã bị hủy bỏ. đây là một quan điểm tốt. –

2

Thay vì UNION, hãy sử dụng UNION ALL, trừ khi bạn đặc biệt muốn loại bỏ các hàng trùng lặp. UNION tự nó mất nhiều thời gian hơn để thực hiện (vì sắp xếp nó thực hiện tìm kiếm hai lần) và loại bỏ các hàng trùng lặp.

8

Rất khó để kể từ truy vấn của bạn cho dù bạn mong đợi dữ liệu được trả về dựa trên UNION, hoặc như một khung nhìn chứa các cột một cách rõ ràng. Điều này rõ ràng là có hiệu lực.

Hãy xem xét ví dụ sau đây:

TableA 
ID Name RelatedID 
1 John 2 
2 Paul 1 

TableB 
ID Name RelatedID 
1 Ringo 1 
2 George 1 

TableC 
ID Name RelatedID 
1 Bob 1 

TableD 
ID Name RelatedID 
1 Kate NULL 

Bây giờ, chạy truy vấn sau đây chống lại điều này:

SELECT ID, Tên TỪ TableA UNION ALL SELECT ID, Tên TỪ TableB UNION ALL CHỌN ID, Tên FROM BảngC UNION ALL ID CHỌN, Tên FROM BảngD

Kết quả này s trong kết quả sau:

1 John 
2 Paul 
1 Ringo 
2 George 
1 Bob 
1 Kate 

Đây có phải là những gì bạn đang theo dõi không? Nếu vậy, bạn sử dụng truy vấn UNION.

Bây giờ, nếu hiệu ứng bạn đang theo đuổi là phải có một cái nhìn riêng biệt của dữ liệu có liên quan, bạn có thể cần phải làm một cái gì đó như thế này:

SELECT A.ID MasterID, A.Name MasterName, 
     B.ID BandID, B.Name BandName, 
     C.ID BlackadderID, C.Name BlackadderName 
     D.ID BlackadderRealID, D.Name BlackadderRealName 
FROM 
    TableA A 
INNER JOIN 
    TableB B 
ON 
    A.RelatedID = B.ID 
INNER JOIN 
    TableC C 
ON 
    B.RelatedID = C.ID 
INNER JOIN 
    TableD D 
ON 
    C.RelatedID = D.ID 

này sẽ cho kết quả trong giao diện sau đây của dữ liệu:

MasterID MasterName BandID BandName BlackAdderID BlackAdderName BlackadderRealID BlackadderRealName 
1   John  2  George 1   Bob    1     Kate 
2   Paul  1  Ringo 1   Bob    1     Kate 
Các vấn đề liên quan