2010-08-15 79 views
2

這可能是一條簡單的SQL語句,但是由於我已經完成了SQL並且遇到了問題,這已經有一段時間了。我有這個表設計:多行SQL Where子句

ID PositionId Qty  LeagueId 
1  1   1   5 
2  3   2   5 
3  8   5   2 
4  1   6   4 

我需要得到的是所有具有特定PositionId和Qty的行。喜歡的東西:

SELECT  ID, PositionId, LeagueId, Qty 
FROM   Lineups 
WHERE  (PositionId = 1 AND Qty = 1) AND (PositionId = 3 AND Qty = 2) 

我想要得到的是LeagueId 5退回,因爲它具有1 PositionId和數量1和3 PositionId和數量2.我不希望使用OR語句,因爲如果我將WHERE更改爲:

WHERE (PositionId = 1 AND Qty = 1) OR (PositionId = 3 AND Qty = 1) 

然後5的LeagueId仍然會返回。

+0

即使PositionID和Qty值不止一次匹配,您只想返回一個聯賽ID? – 2010-08-15 17:40:42

+0

好吧,它顯然是多行的,同一個LeagueId,所以我需要使用Distinct關鍵字。這只是數據的一個子集,但它也應該返回所有的PositionId,它們的PositionId爲1,數量爲1,PositionId爲3,數量爲2. – 2010-08-16 00:31:23

回答

2

試試這個:

Select Distinct LeagueId 
    From LineUps L 
    Where Exists (Select * From LineUps 
       Where LeagueId = L.LeagueId 
        And PositionId = 1 
        And Qty = 1) 
    And Exists (Select * From LineUps 
       Where LeagueId = L.LeagueId 
        And PositionId = 3 
        And Qty = 2) 

這更加緊密地語義上代表了你的意圖

+1

這樣可以方便很多(可能更有效地利用): SELECT DISTINCT LeagueId FROM陣容 WHERE(positionId,數量)在((1,1)寫入,(3,2)) – 2010-08-15 17:46:58

+0

從不指望你使用的語法對性能有什麼影響。在大多數數據庫供應商的產品中,只要符合邏輯意圖,查詢處理器/優化器在決定如何實現sql方面擁有廣泛的自由度。出於這個原因,除非存在已知的性能問題,否則我傾向於使用最能代表邏輯意圖的SQL。 – 2010-08-15 21:33:25

1

這將返回5:

SELECT DISTINCT lineups1.leagueid 
FROM lineups AS lineups1 INNER JOIN lineups AS LINEUPS2 
ON lineups1.LeagueId=lineups2.LeagueId 
WHERE lineups1.PositionId=1 AND lineups2.Qty = 1 
    AND lineups2.PositionId=3 AND lineups2.Qty = 2 

既然你只能選擇單一的行,你必須加入其他表,如果你要考慮不止一個。在這種情況下,表格是「自我加入」陣容,根據另一行的條件從一行中檢索值(當然,因爲它們完全相同,所以選擇哪個球員並不重要)。

更新當然你也可以這樣延伸到

SELECT lineups1.ID, ..., lineupts2.ID, ... 

來檢索要檢索哪個領域。

+0

寫了這個,我很喜歡Charles和Will的方法; ) – Nicolas78 2010-08-15 17:21:49

6

執行此的一般方法是:

SELECT  LeagueId 
FROM   Lineups 
WHERE  (PositionId = 1 AND Qty = 1) OR (PositionId = 3 AND Qty = 2) OR ... 
GROUP BY  LeagueId 
HAVING COUNT(*) = <number of OR'ed together clauses> 
0

你還可以嘗試:

SELECT  ID, PositionId, LeagueId, Qty 
FROM   Lineups 
WHERE  (PositionId = 1 AND Qty = 1) 
AND ID IN (SELECT ID FROM Lineups WHERE PositionId=3 AND Qty=2) 
1
SELECT  DISTINCT LeagueId /*to display non-repeating record*/ 
FROM   Lineups 
WHERE  PositionId in (1,3) AND Qty in (1,2) /*OR*/ 

第一條語句會返回聯盟ID爲5的2條記錄,但如果您的意圖是獲取包含這些位置和數量的聯盟ID,則用'OR'替換'AND',然後返回聯盟Id 4和5.

+0

如果你可以給這個答案增加一些解釋,它會更好:) – MeanGreen 2015-11-10 07:41:04

+0

第一條語句將返回2條聯盟ID爲5的記錄,但是如果你的意圖是獲得包含這些位置的聯賽ID並且數量替換'和'與'或',那麼它會返回聯盟Id 4和5.希望這會有所幫助。 =) – MrRobot614 2015-11-11 06:03:05