Подтвердить что ты не робот

SQL-запрос, где "IN" действует как "AND", а не "OR"?

Простите заглавие, я не знаю, как это назвать. Итак, представьте себе, что у меня это

table_ref

id_x|id_y
---------
6|70
6|71
6|72
6|73
8|70
8|73
9|72
9|73

Как выбрать id_y только в том случае, если он соответствует id_x= 6 & 8 & 9? в этом случае он должен вернуть мне 73

возвращаемый результат id_y затем будет использоваться как внутреннее соединение в другом запросе sql.

4b9b3361

Ответ 1

Конечно, трудно параметризовать, но если это важно, вы можете передать значения в качестве параметра таблицы.

SELECT T.id_y
FROM table_ref T
  JOIN (VALUES (6), (8), (9)) A(id_x)
    ON T.id_x = A.id_x
GROUP BY T.id_y
HAVING COUNT(*) = 3

Ответ 2

SELECT distinct [idy] 
FROM Table_1
WHERE idy in (SELECT idy FROM Table_1 WHERE idx=6)
AND idy in (SELECT idy FROM Table_1 WHERE idx=8)
AND idy in (SELECT idy FROM Table_1 WHERE idx=9)

Ответ 3

Пожалуйста, попробуйте следующее:

select a.* from  table_ref as a
inner join table_ref as b 
        on a.id_y = b.id_y
        and b.id_x = 8
inner join table_ref as c
        on a.id_y = c.id_y
        and c.id_x = 9
where a.id_x = 6

Ответ 4

Да, вы можете использовать простой IN, чтобы выполнить это:

sqlite> SELECT * FROM table_ref;
6|70
6|71
6|72
6|73
8|70
8|73
9|72
9|73
sqlite> SELECT id_y
...> FROM table_ref t
...> WHERE id_x IN (6,8,9)
...> GROUP BY t.id_y
...> HAVING COUNT(*) = 3;
73          

Ответ 5

Это работает даже на SQL Server 2005.

Вы можете использовать несколько EXIST s:

SELECT DISTINCT  t.id_y
FROM dbo.table_ref t
WHERE EXISTS(
   SELECT 1 FROM dbo.table_ref t2
   WHERE t2.id_y=t.id_y AND t2.id_x = 6
)
AND EXISTS(
   SELECT 1 FROM dbo.table_ref t2
   WHERE t2.id_y=t.id_y AND t2.id_x = 8
)
AND EXISTS(
   SELECT 1 FROM dbo.table_ref t2
   WHERE t2.id_y=t.id_y AND t2.id_x = 9
)

Демо

Это не выглядит красивым, но оно работает и эффективно с соответствующими индексами.

Ответ 6

с использованием внутреннего соединения:

SELECT a.id_y
FROM
  (SELECT id_x, id_y 
   FROM table_ref 
   WHERE id_x =6 )a INNER JOIN
  (SELECT  id_x, id_y 
   FROM table_ref 
   WHERE id_x =8)b on a.id_y = b.id_y
 INNER JOIN
 (SELECT id_x, id_y 
  FROM table_ref  
  WHERE id_x =9)c on b.id_y = c.id_y

здесь: http://sqlfiddle.com/#!3/28bcb/6

Ответ 7

Это должно работать:

SELECT          [id_y]
FROM            [table_ref]
WHERE           [id_x] IN (6, 8, 9)
GROUP BY        [id_y]
HAVING          Count(DISTINCT [id_x]) = 3

Если вы хотите получить диапазон значений из отдельной таблицы, вы можете сделать это с помощью

DECLARE @Lookup TABLE (ID INT)
INSERT INTO @Lookup VALUES (6), (8), (9)

SELECT          [id_y]
FROM            [table_ref] 
WHERE           [id_x] IN (SELECT [ID] FROM @Lookup)
GROUP BY        [id_y]
HAVING          Count(DISTINCT [id_x]) = (SELECT Count(DISTINCT [ID]) FROM @Lookup)

Ответ 8

Если вам требуется нечто более общее:

SELECT   id_y
FROM     table_ref
GROUP BY id_y
WHERE    COUNT(DISTINCT id_x)) = (SELECT COUNT(DISTINCT id_x)) FROM table_ref)

Возвращает только значение id_y, связанное с каждым id_x в таблице, независимо от количества id_x

Ответ 9

Как насчет этого?

Select blah
From OtherTable
Where id_y in ( Select id_y from table_ref where id_x in (6,8,9))