SQL-запрос для поиска идентификаторов, где field1 = x и field1 = y - PullRequest
1 голос
/ 28 февраля 2011

У меня есть эта таблица (упрощенно)

 ID  | Field1
---------------------------------
 2   | Cat     
 2   | Goat
 6   | Cat
 6   | Dog 

Мне нужно найти идентификаторы, где существует запись, значением которой для field1 является cat, и для того же идентификатора существует другая запись, значением которой является Goat.В этом случае будет возвращен только идентификатор 2.

Выполнение чего-либо подобного ниже не будет работать.где Field1 = 'Cat' и Field1 = 'Goat'

Я предполагаю, что здесь нужен какой-то подзапрос?Я не совсем уверен.(С использованием SQL Server 2008)

Ответы [ 5 ]

2 голосов
/ 28 февраля 2011

Попробуйте:

SELECT id FROM
(
 SELECT id FROM <YOUR_TABLE> WHERE Field1 = 'Cat'
 INTERSECT
 SELECT id FROM <YOUR_TABLE> WHERE Field1 = 'Goat'
) a

Альтернатива:

SELECT a.ID 
  FROM <YOUR_TABLE> a INNER JOIN <YOUR_TABLE> b 
    ON a.ID = b.ID
WHERE a.Field1 = 'CAT'
  AND b.Field1 = 'GOAT'
2 голосов
/ 28 февраля 2011

Использование:

  SELECT t.id
    FROM YOUR_TABLE t
   WHERE t.field1 IN ('Cat', 'Goat')
GROUP BY t.id
  HAVING COUNT(DISTINCT t.field1) = 2

Ключ здесь использует COUNT (DISTINCT ...), чтобы получить счетчик значений field1. Не имеет значения, есть ли у пользователя Cat 3x и собака 1x ... если только вам не нужно отфильтровать их?

Другая опция - INTERSECT, которая возвращает любые отличные значения, которые возвращаются как запросом слева, так и справа от операнда INTERSECT :

SELECT a.id 
  FROM YOUR_TABLE a 
 WHERE a.field1 = 'Cat'
INTERSECT
SELECT b.id 
  FROM YOUR_TABLE b 
 WHERE b.field1 = 'Goat'
0 голосов
/ 28 февраля 2011
SELECT DISTINCT t1.ID 
FROM table t1, table t2
WHERE t1.ID=t2.ID AND t1.Field1 <> t2.Field1
0 голосов
/ 28 февраля 2011

Используйте запрос как этот

SELECT ID FROM table INNER JOIN 
    (SELECT ID, COUNT(FILED1) AS Expr1 
       FROM table GROUP BY ID 
          HAVING COUNT(FIELD1) > 1) SR ON table.ID = SR.ID  WHERE table.FIELD1 = 'Cat'

Так что вам просто нужно поместить переменную с DECLARE для 'Cat', если вы хотите иметь более динамический запрос

0 голосов
/ 28 февраля 2011

Не проверено, но что-то подобное может работать

select t1.ID from tbl t1 inner join tbl t2 on t1.ID=t2.ID
where (t1.Field1='Cat' and t2.Field1='Goat')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...