Qual é o SQL correto para usar onde ID em Lista e os itens estão com operador AND

Eu preciso de uma instrução SQL para usar o operador IN dentro dos itens com ” E “conectado.

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

é equivalente a:

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

O que eu preciso é para gerar usando o operador IN (ou equivalente):

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

Porque eu coleto todos os IDs (ex: [1,2,3,4,5]) em uma string e pesquise com ela no banco de dados.

Mais explicações:

ID é sempre uma chave primária

O caso é que eu tenho uma tabela que contém todos os países, e cada país tem vários padrões elétricos em uma tabela separada.

Exemplo: Alemanha requer sempre “standard1” e “standard2” EUA requer sempre “Standard1” e “standard3” França requer sempre “Standard2”

Se o usuário no aplicativo C # pesquisar por um país que tem “Standard2”, o sistema deve dar a ele Alemanha e França.

MAS Se o usuário deseja países com “Standard1” E “standard2”, o sistema deve fornecer apenas a Alemanha. -> por causa de “AND”

Minha consulta era

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

[1,2] é uma lista concatenada que o usuário já escolheu de uma lista de padrões.

Comentários

  • Se id for a chave primária, então WHERE (id=1) AND (id = 2) AND (id = 3) retornará 0 linhas. Sempre.
  • Se id não for a chave primária ou única, então você provavelmente deseja a divisão relacional. Qual é o caso?
  • Mesmo se id não for único, só pode ser 1 OU 2 OU 3 em qualquer linha.
  • Acho que agora podemos fechá-lo como duplicado de: Pesquisar no mesmo ID em várias linhas
  • Ou talvez este, que tem mais maneiras de fazer e um título que se assemelha ao título aqui: Faça a cláusula IN se comportar como a cláusula AND

Resposta

Acho que o que você está tentando fazer é divisão relacional . Aqui está a melhor explicação que poderia encontrar

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

Honestamente, ainda não entendo totalmente isso, mas acredito que deve funcionar (usando uma tabela intermediária):

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 

Isso se baseia em seu exemplo, mas Testei mais combinações e funciona se os valores comentados forem alterados.

Existem muitas outras maneiras de fazer a divisão explicada no link fornecido acima – você deve usar aquela que melhor se adapta aos seus objetivos.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *