Hvad er den korrekte SQL til brug af hvor ID på listen og elementerne er med AND-operator

Jeg har brug for en SQL-erklæring for at bruge IN-operator inden for elementerne med ” Og “forbundet.

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

svarer til:

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

Det jeg har brug for er at generere ved hjælp af IN-operator (eller tilsvarende):

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

Fordi jeg indsamler alle IDerne (f.eks: [1,2,3,4,5]) i en streng og søg med den i DB.

Flere forklaringer:

ID er altid en primær nøgle

Sagen er, at jeg har en tabel, der har alle lande, og hvert land har flere elektriske standarder i separat tabel.

Eksempel: Tyskland kræver altid “standard1” og “standard2” USA kræves altid “Standard1” og “standard3” Frankrig kræver altid “Standard2”

Hvis brugeren i C #-applikationen søger efter et land, der har “Standard2”, skal systemet give ham Tyskland og Frankrig.

MEN Hvis brugeren ønsker lande med “Standard1” OG “standard2”, bør systemet kun give ham Tyskland. -> på grund af “OG”

Min forespørgsel var

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

[1,2] er en sammenkædet liste, som brugeren allerede vælger fra en liste over standarder.

Kommentarer

  • Hvis id er den primære nøgle, så er WHERE (id=1) AND (id = 2) AND (id = 3) returnerer 0 rækker. Altid.
  • Hvis id ikke er den primære eller unikke nøgle, vil du sandsynligvis have relationel opdeling. Hvad er tilfældet?
  • Selvom id ikke er entydigt, kan det kun være 1 ELLER 2 ELLER 3 på en hvilken som helst enkelt række.
  • Jeg tror nu kan vi lukke det som duplikat af: Søg inden for samme ID på tværs af flere rækker
  • Eller måske denne, der har flere måder at gøre det og en titel, der ligner titlen her: Få IN-klausul til at opføre sig som OG-klausul

Svar

Jeg tror, hvad du prøver at gøre er relationel division . Her er den bedste forklaring, jeg kunne finde

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

Ærligt talt forstår jeg det ikke helt selv endnu, men jeg mener, at dette skal fungere (ved hjælp af en mellemliggende tabel):

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 

Dette er baseret på dit eksempel, men Jeg testede flere kombinationer, og det virker, hvis de kommenterede værdier ændres.

Der er mange andre måder at udføre den deling, der er forklaret i linket ovenfor – du skal bruge den, der passer bedst til dine formål.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *