2014-10-17 91 views
2

我有TableA with userAId和UserBId。從子查詢中選擇兩次

我也得到了用戶id另一個表B

我想選擇表A的所有記錄,其中userAId和UserBId是TableB中

我的解決辦法是:

select * from TableA where 
    userAId IN 
    (
    select UserId from Table B 
) 

    and UserBId IN 
    (
    select UserId from Table B 
) 

,但我認爲它不是最佳解決方案,因爲我從表B中選擇UserId兩次

任何其他解決方案?

進出口使用T-SQL SQL seerver 2008 R2

回答

2

也許是這樣的:

select * from TableA a where (
    select count(DISTINCT UserID) from TableB where UserID in (a.UserAId, a.UserBId) 
) = 2 

更新:我改變Count(*)Count(DISTINCT UserID)由@Thorsten KETTNER指出IN子句的

+1

迄今唯一正確的答案並沒有upvotes唯一的一個。難以置信。這裏是我的+1。如果tableB中的一個用戶可以有多個條目,那麼應該是'COUNT(DISTINCT UserID)'。 – 2014-10-17 19:49:37

+0

該查詢的速度與OP的嘗試速度相似,在tableB上連接兩次會快得多 – radar 2014-10-17 23:07:24

0

相反,與表B連接兩次會更快 您可以將其與執行計劃進行比較

select A.* from TableA A 
join TableB B1 
on A.userAID = B1.UserId 
join TableB B2 
AND A.userBId = B2.userID 
+0

奇怪地看到upvotes爲此。您的查詢正在查找tableB中的一條記錄,其中userID與userAId和userBId都匹配。這與要求的內容相距甚遠。 – 2014-10-17 19:45:55

+0

是的,你的不這樣做。如果userAId爲'A'且userBId爲'B'並且兩個用戶都存在於tableB中,那麼您的查詢仍然找不到它,因爲它正在查找一個tableB記錄,其中UserId同時爲'A'和'B' ,這是不可能的。您的陳述僅適用於userAId = userBId的記錄。 – 2014-10-17 19:52:50

+0

@Thorsten Kettner,+1指出,做兩次連接會比我的狀態更快 – radar 2014-10-17 20:11:03

0

如果表b中的數據較少,則只能使用cte。如果你的查詢給了你想要的東西,那麼它不能在連接中轉換,因爲連接將會一對一地匹配,即tableA的一個記錄將匹配tableB的一個關於連接條件/條件的記錄,但是在這裏你將一個userAID與所有UserBId所有。

;WITH cte_usrId(UserId) 
AS (SELECT UserId 
    FROM TableB) 
SELECT * 
FROM TableA 
WHERE userAId IN (SELECT UserId 
        FROM cte_usrId) 
     AND UserBId IN (SELECT UserId 
         FROM cte_usrId) 
1

您自己的解決方案可能看起來有點過於複雜,但它很可能是最好的和最有效的方法。如果在tableB.userId上有索引,訪問將會很快。

如果訪問速度太慢,那麼你可以通過在tableA(userAId,userBId)上提供一個索引來加速它。

留在您的查詢。它很容易閱讀,做它應該做的事,並且做得很快。

0

試試這個

SELECT * 
FROM TableA a 
WHERE EXISTS (SELECT 1 
       FROM table b 
       WHERE a.userAId = b.userid 
         AND a.UserBId = b.userid)