2012-05-22 80 views
11

Tôi có một cơ sở dữ liệu rất khó hiểu với một bảng chứa hai giá trị tôi cần trong một bảng riêng biệt. Đây là vấn đề của tôi:Tham gia bảng hai lần - trên hai cột khác nhau của cùng một bảng

Table1 
- id 

Table2 
- id 
- table1_id 
- table3_id_1 
- table3_id_2 

Table3 
- id 
- value 

Tôi cần phải đi từ table1 và làm một tham gia mà sẽ cung cấp cho tôi trở lại giá trị từ table3 trong hai cột riêng biệt. Vì vậy, tôi muốn một cái gì đó như thế này:

table1.id | table2.id | table2.table3_id_1 | table2.table3_id_2 | X | Y 

đâu XY là những giá trị cho hàng nối với nhau bằng table3_id_1table3_id_2 tương ứng.

Có thể biến chúng thành biến hoặc thứ gì đó để tôi có thể lọc chúng theo mệnh đề WHERE?

Trả lời

26
SELECT t2.table1_id 
    , t2.id   AS table2_id 
    , t2.table3_id_1 
    , t2.table3_id_2 
    , t31.value  AS x 
    , t32.value  AS y 
FROM table2 t2 
LEFT JOIN table3 t31 ON t31.id = t2.table3_id_1 
LEFT JOIN table3 t32 ON t32.id = t2.table3_id_2; 

Không cần phải tham gia vào table1. table2 có tất cả những gì bạn cần - giả sử có foreign key constraint đảm bảo tính toàn vẹn tham chiếu (tất cả t2.table1_id thực sự có trong table1). Khác bạn có thể muốn tham gia table1, do đó chỉ chọn các hàng có trong table1.

Tôi sử dụng LEFT [OUTER] JOIN (and not [INNER] JOIN) để tham gia vào cả hai trường hợp table3 vì lý do tương tự: không rõ liệu tính toàn vẹn tham chiếu có được đảm bảo hay không - ans cho dù bất kỳ cột nào có thể là NULL. An [INNER] JOIN sẽ thả các hàng từ kết quả mà không tìm thấy kết quả phù hợp. Tôi giả sử bạn muốn hiển thị các hàng như vậy với giá trị NULL cho bất kỳ thiếu x hoặc y nào.

table3.id cần phải được UNIQUE, hoặc chúng ta có thể nhân lên hàng với một số trận đấu từ mỗi LEFT JOIN:

7

Nếu bạn tham gia một bảng nhiều lần, sử dụng bí danh để phân biệt chúng:

SELECT table1.id,table2.id,table2.table3_id_1,table2.table3_id_2,t3_1.id,t3_2.id 
FROM table1 
JOIN table2 ON table1.id=table2.table1_id 
JOIN table3 t3_1 ON table2.table3_id_1=t3_1.id 
JOIN table3 t3_2 ON table2.table3_id_2=t3_2.id 
WHERE ... t3_1.id=... AND ... t3_2.id=... 
3
select t1.id as table1_id, 
    t2.id as table2_id, 
    t2.table3_id_1, 
    t2.table3_id_2, 
    t3_1.value as X, 
    t3_2.value as Y 
from Table1 t1 
inner join Table2 t2 on t1.id = t2.table1_id 
inner join Table3 t3_1 on t2.table3_id_1 = t3_1.id 
inner join Table3 t3_2 on t2.table3_id_2 = t3_2.id 
where t3_1.value = 'some_value' 
    or t3_2.value = 'some_other_value' 
Các vấn đề liên quan