2016-07-20 52 views
3

我想要一個查詢,選擇全部記錄來自表A並且沒有其他記錄。但是,我希望我的查詢包含一個表示表B中存在1個或更多記錄的列。指示一個或多個記錄存在於單獨表中的T-SQL列

LEFT OUTER JOIN tableA to tableB does not work,because such as 2 records in table B that related to a record in tableA I get 2 records in the result set。我只想要1.

RIGHT OUTER JOIN不起作用,因爲我的查詢返回tableB中與tableA中任何記錄不匹配的所有記錄。我不想從tableB中獲取不匹配tableA中至少1條記錄的記錄。

INNER JOIN也失敗了,因爲我沒有在tableA中得到全部的記錄;只有那些在tableB中包含匹配記錄的人。

就好像我需要這樣的查詢:

SELECT tableA.ID, IF EXISTS row in tableB THEN 1 ELSE 0 
FROM tableA <some sort of join> tableB on tableA.ID = tableB.FKtoTableA 

回答

3

由於這樣的事實,我們的目標是僅僅是爲了生存測試,然後我們強烈建議您使用EXISTS條款在線:

SELECT A.* 
    , CASE 
      WHEN EXISTS (
       SELECT 1 
       FROM TableB B 
       WHERE B.Id = A.Id 
      ) THEN 1 
      ELSE 0 
     END 
FROM TableA A 

這個typically going to be faster不僅僅是一個採用LEFT JOIN + IS NOT NULLCOUNT的解決方案,並且具有與您的問題陳述一致的語義的額外好處。

2

你可以使用子查詢:

選擇 表A *, (從tableB的SELECT COUNT(*),其中tableA.ID = tableB.ID)從表A 'TableB中計數'

如果需要,你可以在子查詢周圍包裝一個條件語句或者case語句來給你更多的布爾值。

2

你可以使用left join,只有在彙總數據從B拉:

select a.id, cast(count(b.id) as bit) from a left join b on a.id = b.id group by a.id; 

example

轉換爲bit促進任何非零值設爲1。

+0

如果它的確與衆不同不知道,但不是對行進行計數,您可以使用isnulll(select top 1 1 ...,0) –

相關問題