tipos resueltos ejercicios ejemplos datos consultas complejas sql sql-server sql-server-2008 tsql relational-division

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 )

Demo

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)