resueltos - ¿Consulta SQL donde ''IN'' actúa como ''AND'' no ''OR''?
ejemplos de sql en base de datos (9)
Perdona el título, no tengo ni idea de cómo llamarlo. Así que imagina que tengo esto
table_ref
id_x|id_y
---------
6|70
6|71
6|72
6|73
8|70
8|73
9|72
9|73
¿Cómo puedo seleccionar id_y
solo si coincide con id_x= 6 & 8 & 9
? En este caso me debería devolver 73
el resultado devuelto de id_y
se usará como una unión interna en otra consulta de SQL.
¿Qué tal esto?
Select blah
From OtherTable
Where id_y in ( Select id_y from table_ref where id_x in (6,8,9))
Esto debería funcionar:
SELECT [id_y]
FROM [table_ref]
WHERE [id_x] IN (6, 8, 9)
GROUP BY [id_y]
HAVING Count(DISTINCT [id_x]) = 3
Si desea obtener el rango de valores de una tabla separada, puede hacerlo con:
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)
Esto funciona incluso en SQL-Server 2005.
Puedes usar múltiples 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
)
Eso no se ve bien pero funciona y es eficiente con índices adecuados.
Por favor intente esto:
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
Por supuesto, es difícil de parametrizar, pero si es importante, puede pasar los valores como parámetro con valores de tabla.
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
Sí, puedes usar una entrada simple para lograr eso:
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
Si quieres algo un poco más general:
SELECT id_y
FROM table_ref
GROUP BY id_y
WHERE COUNT(DISTINCT id_x)) = (SELECT COUNT(DISTINCT id_x)) FROM table_ref)
Devuelve solo el valor de id_y asociado con cada id_x en la tabla, independientemente del número de id_x
utilizando la unión interna:
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
demostración aquí: http://sqlfiddle.com/#!3/28bcb/6
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)