Jeg trenger en SQL-setning for å bruke IN-operatør innenfor elementene med » Og «tilkoblet.
SELECT * from tbl_Users WHERE id in [1,2,3]
tilsvarer:
SELECT * from tbl_Users WHERE (id=1) or (id = 2) or (id = 3)
Det jeg trenger er å generere ved hjelp av IN-operator (eller tilsvarende):
SELECT * from tbl_Users WHERE (id=1) AND (id = 2) AND (id = 3)
Fordi jeg samler alle ID-ene (f.eks: [1,2,3,4,5]) i en streng og søk med den i DB.
Mer forklaring:
ID er alltid en primærnøkkel
Saken er at jeg har en tabell som har alle land, og hvert land har flere elektriske standarder i hver sin tabell.
Eksempel: Tyskland krever alltid «standard1» og «standard2» USA krever alltid «Standard1» og «standard3» Frankrike krever alltid «Standard2»
Hvis brukeren i C # -programmet søker etter et land som har «Standard2», bør systemet gi ham Tyskland og Frankrike.
MEN Hvis brukeren ønsker land med «Standard1» OG «standard2», bør systemet bare gi ham Tyskland. -> på grunn av «AND»
Min forespørsel var
Select * from [tables and joins] where STANDARD_id IN [1,2]
[1,2] er en sammenkoblet liste som brukeren allerede velger fra en liste over standarder.
Kommentarer
Svar
Jeg tror det du prøver å gjøre er relasjonell divisjon . Her er den beste forklaringen jeg kunne finne
https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/
Ærlig talt forstår jeg ikke dette selv ennå, men jeg mener at dette skal fungere (ved hjelp av en mellomtabell):
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 basert på eksemplet ditt, men Jeg testet flere kombinasjoner, og det fungerer hvis de kommenterte verdiene endres.
Det er mange andre måter å gjøre divisjonen på, som er forklart i lenken ovenfor – du bør bruke den som passer best for dine formål.
id
er den primære nøkkelen, så erWHERE (id=1) AND (id = 2) AND (id = 3)
returnerer 0 rader. Alltid.id
ikke er den primære eller unike nøkkelen, vil du sannsynligvis ha relasjonell inndeling. Hva er tilfelle?id
ikke er unikt, kan det bare være1
ELLER2
ELLER3
på en enkelt rad.