¿Cuál es el SQL correcto para usar where ID en List y los elementos están con el operador AND

Necesito una declaración SQL para usar el operador IN dentro de los elementos con » Y «conectado.

SELECT * from tbl_Users WHERE id in [1,2,3] 

es equivalente a:

SELECT * from tbl_Users WHERE (id=1) or (id = 2) or (id = 3) 

Lo que necesito es para generar usando el operador IN (o equivalente):

SELECT * from tbl_Users WHERE (id=1) AND (id = 2) AND (id = 3) 

Porque recopilo todos los ID (por ejemplo: [1,2,3,4,5]) en una cadena y busque con ella en la base de datos.

Más explicación:

ID es siempre una clave primaria

El caso es que tengo una tabla que tiene todos los países, y cada país tiene varios estándares eléctricos en una tabla separada.

Ejemplo: Alemania requiere siempre «estándar1» y «estándar2» EE. UU. requiere siempre «Estándar1» y «estándar3» Francia requiere siempre «Estándar2»

Si el usuario en la aplicación C # busca un país que tiene «Estándar2», el sistema debería darle Alemania y Francia.

PERO Si el usuario quiere países con «Standard1» Y «standard2», el sistema solo debería darle Alemania. -> debido a «Y»

Mi consulta fue

Select * from [tables and joins] where STANDARD_id IN [1,2] 

[1,2] es una lista concatenada que el usuario ya eligió de una lista de estándares.

Comentarios

  • Si id es la clave principal, entonces WHERE (id=1) AND (id = 2) AND (id = 3) devolverá 0 filas. Siempre.
  • Si id no es la clave principal o única, entonces probablemente desee una división relacional. ¿Cuál es el caso?
  • Incluso si id no es único, solo puede ser 1 O 2 O 3 en cualquier fila.
  • Supongo ahora podemos cerrarlo como duplicado de: Buscar dentro del mismo ID en varias filas
  • O tal vez este, que tiene más formas de hacer y un título que se parezca al título aquí: Hacer que la cláusula IN se comporte como la cláusula AND

Respuesta

Creo que lo que estás tratando de hacer es división relacional . Aquí está la mejor explicación que pude encontrar

https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/

Honestamente, todavía no lo entiendo completamente, pero creo que esto debería funcionar (usando una tabla intermedia):

CREATE TABLE tblCountry ( countryId int, countryName nvarchar(100) ) INSERT INTO tblCountry SELECT 1, "Germany" UNION SELECT 2, "United States" UNION SELECT 3, "France" CREATE TABLE tblStandards ( standardId int, standardName nvarchar(100) ) INSERT INTO tblStandards SELECT 1, "standard_1" UNION SELECT 2, "standard_2" UNION SELECT 3, "standard_3" CREATE TABLE tblCountryStandards ( countryId int, standardId int ) INSERT INTO tblCountryStandards SELECT 1, 1 UNION SELECT 1, 2 UNION SELECT 2, 1 UNION SELECT 2, 3 UNION SELECT 3, 2 SELECT countryName FROM tblCountry INNER JOIN tblCountryStandards ON tblCountry.countryId = tblCountryStandards.countryId INNER JOIN tblStandards ON tblStandards.standardId = tblCountryStandards.standardId WHERE tblStandards.standardId IN (1, 2) -- unique standards selected by user GROUP BY tblCountry.countryName HAVING COUNT(DISTINCT tblStandards.standardId) = 2 -- number of standards selected by user above 

Esto se basa en su ejemplo, pero Probé más combinaciones y funciona si se cambian los valores comentados.

Hay muchas otras formas de hacer la división explicada en el enlace proporcionado arriba; debe usar la que mejor se adapte a sus propósitos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *