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
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.
id
er den primære nøgle, så erWHERE (id=1) AND (id = 2) AND (id = 3)
returnerer 0 rækker. Altid.id
ikke er den primære eller unikke nøgle, vil du sandsynligvis have relationel opdeling. Hvad er tilfældet?id
ikke er entydigt, kan det kun være1
ELLER2
ELLER3
på en hvilken som helst enkelt række.