2011-10-05 68 views
1
TableA Columns: A_ID, NAME, SOURCE, TITLE, EVENTID 
TableB Columns: B_ID, EVENTID, CODE, FIELD 

如何提取NAME,SOURCE,TITLE和FIELD或null(如果存在CODE = x)?示例應該會更好。它是SQL Server Express上的T-SQL。T-SQL從TableA中選擇所有條件並在TableB上條件

實施例:

TableA         | TableB 
----------------------------------------------------------------------- 
A_ID, NAME, SOURCE, TITLE, EVENTID  | B_ID, EVENTID, CODE, FIELD 
----------------------------------------------------------------------- 
1  john s1  x  100   | 1  100  5  textA 
2  bruce s2  y  105   | 2  100  10 textB 
3  bob s3  z  110   | 3  105  5  textC 
             | 4  110  5  textD 
             | 5  110  10 textE 

沒有代碼10 EVENTID 105所以結果應爲空。如何寫一個SELECT quesry這會給我這樣的結果:

[ john | s1 | x | textB ] 
[ bruce | s2 | y |  ] 
[ bob | s3 | z | textE ] 

這可能是很容易的,但我不出來..在此先感謝。

回答

3

您需要的B.CODE = 10條件需要JOIN不是WHERE子句中去,以避免有效地將查詢回到一個INNER JOIN

SELECT A.NAME, 
     A.SOURCE, 
     A.TITLE, 
     B.FIELD 
FROM TableA A 
     LEFT JOIN TableB B 
     ON A.EVENTID = B.EVENTID 
      AND B.CODE = 10 

之間的OUTER JOIN

如果存在多個加入記錄,則可以爲特定的A值返回多行,但是如果數據在數據中可能會出現這種情況(如果應該使用該值),則不清楚這可能是你想要的行爲。

+0

謝謝解釋。也適用。總是隻有一個加入記錄。你能告訴我,有什麼辦法可以擴展這個ON/AND來添加更多的這樣的列嗎?例如代碼15(如果存在,如果不爲空)。然而,價值將再次在FIELD只是用不同的代碼.. – yosh

+1

@yosh - 對於一個額外的列,我只是將'LEFT JOIN TableB B2 ON A.EVENTID = B2.EVENTID和B2.CODE = 15'添加到查詢和'B2.FIELD'到選擇列表。如果還有更多,我可能會考慮採用不同的方法。 –

+0

對,我沒有想到這個:)我想我只需要1-2列。非常感謝 ! – yosh

2

這應該這樣做

SELECT a.NAME, a.SOURCE, a.TITLE, b.FIELD 
    FROM TableA a 
     LEFT JOIN TableB b ON b.EventId = a.EventId 
      AND b.Code = 10