Многострочный оператор SQL Where - PullRequest
2 голосов
/ 15 августа 2010

Вероятно, это простой оператор 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)

Тогда LeagueId из 5 все равно будет возвращен.

Ответы [ 5 ]

6 голосов
/ 15 августа 2010

Общий способ выполнения этого будет:

 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>
2 голосов
/ 15 августа 2010

Попробуйте это:

   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 голос
/ 10 ноября 2015
SELECT       DISTINCT LeagueId /*to display non-repeating record*/
FROM         Lineups
WHERE        PositionId in (1,3) AND Qty in (1,2) /*OR*/

Первый оператор вернет 2 записи, в которых идентификаторы лиги равны 5, но если вы намерены получить идентификаторы лиги, содержащие эти позиции и QTY, замените 'И' на 'ИЛИ', тогда он вернет лигуId 4 и 5.

1 голос
/ 15 августа 2010

Это должно вернуть 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 голосов
/ 15 августа 2010

Вы также можете попробовать:

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)
...