2014-06-05 147 views
1

對不起,對於這個問題,我找不到解決這個簡單問題的方法。SQL查詢加入多個條件

我有2個表:

TABLE A 
R_ID integer 
CID1 integer 
CID2 integer 
CID3 integer 
CID4 integer 



TABLE C 
CID integer 
NAME varchar(50) 

我想要做的是,將輸出,對於每一個表中的一行,的CID1CID2名稱等,考慮到CID1有一個查詢總是一個值,CID2CID3CID4可能是NULL,我不能使用UNION,在我的小號

這是我的出發點:

SELECT a.R_ID, c.NAME 
FROM A a, C c 
WHERE (a.CID1 = c.CID or a.CID2 = c.CID or a.CID3 = c.CID or a.CID4 = c.CID) 

但是,正如你所看到的,它只適用於所有CID被賦值,否則某些結果會有一個空白的NAME字段。

任何提示如何刪除不需要的行將非常感激。

編輯: 我要打印列表:房間# - 在那個房間裏學生的名字,所以輸出的表必須是形式:R_IDNAME

假設:

TABLE A 
1,1,2,NULL,NULL 
2,3,NULL,NULL,NULL 
3,4,NULL,NULL,NULL 

TABLE B 
1, Mark 
2, John 
3, Steve 
4, Nick 

我的目標是獲得一個表是這樣的:

R_ID - NAME 
1 - Mark 
1 - John 
2 - Steve 
3 - Nick 

我得到的是:

1 - Mark 
1 - John 
1 - 
1 - 
2 - Steve 
2 - 
2 - 
2 - 
3 - Nick 
3 - 
3 - 
3 - 

4個LEFT JOIN的解決方案不適用,因爲我不能使用NAME1,NAME2等,但只能使用1個字段名稱。

喜歡的查詢:

SELECT r.R_ID, c.NAME 
FROM A a LEFT JOIN C c on a.CID1 = c.CID 
LEFT JOIN C as c1 on a.CID2 = c1.CID 
LEFT JOIN C as c2 on a.CID3 = c2.CID 
LEFT JOIN C as c3 on a.CID4 = c3.CID 

將輸出:

1 - Mark 
2 - Steve 
3 - Nick 

NAME is not NULL上SQLFiddle完美地工作,但仍存在排沒有名字上的解決方案我mysql 5.5.15(也試過在火鳥2.5,我的電腦上唯一的其他數據庫服務器,但結果相同)

+0

實際問題是什麼? – Strawberry

回答

1

您所查詢的每一個cid值返回一個名字,看到SQLFiddle

什麼可能是一個問題是空的或nameNULL項,見SQLFiddle

你可以用一個解決這個問題簡單加入表ac和另外的where子句

select a.r_id, c.name 
from a 
join c on c.cid in (a.cid1, a.cid2, a.cid3, a.cid4) 
where c.name is not null 

SQLFiddle

當然,你也可以達到同樣的與您的暗示通過添加相同條款

SELECT a.R_ID, c.NAME 
FROM A a, C c 
WHERE (a.CID1 = c.CID or a.CID2 = c.CID or a.CID3 = c.CID or a.CID4 = c.CID) 
     and c.name is not null 

SQLFiddle

如果你有空字符串,而不是NULL值加入,你可以用name in trim也可應對空白

and trim(c.name) <> '' 
+0

解決了你的解決方案,但有了這個奇怪的變化:'和c.name <>'''這種方式完全兼容mysql和firebird – Bux

2

對於TableA中的每個CID列,您需要3個單獨的聯接。

SELECT 
    R_ID, 

    c1.Name As CID1Name, 
    c2.Name As CID2Name, 
    c3.Name As CID3Name 
FROM 
    TableA a 
    LEFT JOIN TableC c1 ON a.CID1 = c1.CID 
    LEFT JOIN TableC c2 ON a.CID2 = c2.CID 
    LEFT JOIN TableC c3 ON a.CID3 = c3.CID 
+0

刪除錯誤後,它仍然返回'NULL'條目,請參閱http://sqlfiddle.com/#!2/bd8429/5 –

+0

你究竟想要什麼?你的意思是你不需要任何行在Name爲NULL的地方?這不會只返回第一行嗎? – codingbiz