多行SQL Where子句

5

这可能是一个简单的SQL语句,但我已经很久没有做过SQL了,现在遇到了问题。我有这个表设计:

 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,因为它既有PositionId为1且Qty为1,也有PositionId为3且Qty为2。我不想使用OR语句,因为如果我将WHERE改成:
 WHERE (PositionId = 1 AND Qty = 1) OR (PositionId = 3 AND Qty = 1)

然后,5的LeagueId仍将被返回。


即使PositionID和Qty的值匹配超过一次,您仍希望只返回一个LeagueID吗? - user330315
显然,这将是多行相同的LeagueId,因此我需要使用Distinct关键字。这只是数据的子集,但它还应该返回所有具有PositionId为1且Qty为1以及PositionId为3且Qty为2的LeagueId。 - Kris B
5个回答

9
一种通用的执行方法是:
 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>

3

试试这个:

   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 LineUps WHERE (positionId, Qty) IN ( (1,1), (3,2) ) - user330315
永远不要指望语法会对性能产生何种影响。在大多数数据库供应商的产品中,查询处理器/优化器可以广泛地决定如何实现您的 SQL,只要它符合逻辑意图。因此,除非存在已知的性能问题,否则我倾向于使用最接近逻辑意图的 SQL。 - Charles Bretana

2

这应该返回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

由于您只能选择单行,如果想考虑多个行,就必须连接另一张表。在这种情况下,您需要进行“自连接”,从而根据另一行的条件检索出一行的值(当然,无论您采用哪个leagueid,因为它们是相同的,所以都没有关系)。

更新 当然,您可以将其扩展到

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

要检索您想要检索的任何字段。


写完这个之后,我更喜欢Charles和Will的方法;) - Nicolas78

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

第一条语句将返回2条记录,其中联赛ID为5,但如果您的意图是获取包含这些位置和数量的联赛ID,则将“AND”替换为“OR”,然后它将返回联赛ID 4和5。

如果您能对这个答案进行一些解释,那就更好了 :) - MeanGreen
第一条语句将返回2个记录,其中联赛ID为5,但如果您的意图是获取包含这些位置和QTY的联赛ID,请用'OR'替换'AND',然后它将返回联赛ID 4和5。希望这可以帮助您。=) - MrRobot614

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接