2010-08-15 81 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