2011-10-05 67 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