2012-02-21 44 views
14

Tôi có một bảng kim loạiNhiều INNER JOIN từ cùng một bảng

MetalID integer 
MetalName text 
MetalCode text 

mục bảng

ItemID  integer 
ItemName text 
... 
Metal1  int Ref.-> metals.metalID 
Metal2  int Ref.-> metals.metalID 
Metal3  int Ref.-> metals.metalID 

Tôi cố gắng để chọn ba MetalCodes

SELECT m.MetalCode as 'Metal1', m.MetalCode as 'Metal2',m.MetalCode as 'Metal3' 
FROM Item as k 
INNER JOIN Metals AS m ON m.metalID=k.metal1 
INNER JOIN Metals AS m ON m.metalID=k.metal2 
INNER JOIN Metals AS m ON m.metalID=k.metal3 
WHERE k.ItemID=? 

Hình như tôi làm điều đó hoàn toàn sai. Hãy giúp tôi.

+3

Bạn không thể có nhiều bí danh có cùng tên. – rid

+1

Bạn đang cố gắng đạt được điều gì? – YXD

Trả lời

20

Bạn nên chỉ định nhiều bí danh cho bảng của mình. bạn đang gọi tất cả chúng m.

SELECT m1.MetalCode as 'Metal1', m2.MetalCode as 'Metal2',m3.MetalCode as 'Metal3' 
FROM Item as k 
INNER JOIN Metals AS m1 ON m1.metalID=k.metal1 
INNER JOIN Metals AS m2 ON m2.metalID=k.metal2 
INNER JOIN Metals AS m3 ON m3.metalID=k.metal3 
WHERE k.ItemID=? 
+2

tốt đẹp, chúng tôi đã viết chính xác mã ví dụ giống nhau tại cùng một thời điểm. Phải là cặp song sinh. +1, trên thực tế :) –

+0

! đó là cách SO hoạt động :) – Beatles1692

+0

Vẫn còn một cái gì đó sai. Tôi nhận được kết quả -> Zn, Zn, Zn trong khi có các kim loại khác nhau – NCFUSN

2

thử điều này:

SELECT m.MetalCode as 'Metal1', n.MetalCode as 'Metal2'o.MetalCode as 'Metal3' 
FROM Item as k INNER JOIN Metals AS m ON m.metalID=k.metal1 
     INNER JOIN Metals AS n ON n.metalID=k.metal2 
     INNER JOIN Metals AS o ON o.metalID=k.metal3 
WHERE k.ItemID=? 
8

Vâng, không hoàn toàn sai. ;)

Bất cứ nơi nào bạn có "INNER JOIN Metals AS m", m cần phải là thứ gì đó độc đáo (không phải m mỗi lần).

Hãy thử một cái gì đó như thế này (không kiểm tra):

SELECT m1.MetalCode as 'Metal1', m2.MetalCode as 'Metal2', m3.MetalCode as 'Metal3' 
FROM Item as k 
INNER JOIN Metals AS m1 ON m1.metalID=k.metal1 
INNER JOIN Metals AS m2 ON m2.metalID=k.metal2 
INNER JOIN Metals AS m3 ON m3.metalID=k.metal3 
WHERE k.ItemID=? 
1
SELECT m1.MetalCode as 'Metal1', m2.MetalCode as 'Metal2',m3.MetalCode as 'Metal3' 
FROM Item as k 
INNER JOIN Metals AS m1 ON m1.metalID=k.metal1 
INNER JOIN Metals AS m2 ON m2.metalID=k.metal2 
INNER JOIN Metals AS m3 ON m3.metalID=k.metal3 
WHERE k.ItemID=? 

hoặc đơn giản hơn nhưng nhận được một metalcode mỗi hàng

SELECT MetalCode 
FROM Item 
WHERE metalID = metal1 OR metalID = metal2 OR metalID = metal3 
Các vấn đề liên quan