Jag behöver ett SQL-uttalande för att använda IN-operatören inom objekten med ” Och ”ansluten.
SELECT * from tbl_Users WHERE id in [1,2,3]
motsvarar:
SELECT * from tbl_Users WHERE (id=1) or (id = 2) or (id = 3)
Vad jag behöver är att generera med hjälp av IN-operatören (eller motsvarande):
SELECT * from tbl_Users WHERE (id=1) AND (id = 2) AND (id = 3)
Eftersom jag samlar in alla ID: s (ex: [1,2,3,4,5]) i en sträng och sök med den i DB.
Mer förklaring:
ID är alltid en primär nyckel
Fallet är att jag har en tabell som har alla länder, och varje land har flera elektriska standarder i separat tabell.
Exempel: Tyskland kräver alltid ”standard1” och ”standard2” USA kräver alltid ”Standard1” och ”standard3” Frankrike kräver alltid ”Standard2”
Om användaren i C # -applikationen söker efter ett land som har ”Standard2”, bör systemet ge honom Tyskland och Frankrike.
MEN Om användaren vill ha länder med ”Standard1” OCH ”standard2”, bör systemet bara ge honom Tyskland. -> på grund av ”OCH”
Min fråga var
Select * from [tables and joins] where STANDARD_id IN [1,2]
[1,2] är en sammanhängande lista som användaren redan väljer från en lista med standarder.
Kommentarer
Svar
Jag tror att det du försöker göra är relationsdivision . Här är den bästa förklaringen jag kunde hitta
https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/
Ärligt talat förstår jag inte helt det här än, men jag tror att detta borde fungera (med hjälp av en mellanliggande tabell):
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
Detta är baserat på ditt exempel, men Jag testade fler kombinationer och det fungerar om de kommenterade värdena ändras.
Det finns många andra sätt att göra den delning som förklaras i länken ovan – du bör använda den som bäst passar dina syften.
id
är den primära nyckeln ärWHERE (id=1) AND (id = 2) AND (id = 3)
returnerar 0 rader. Alltid.id
inte är den primära eller unika nyckeln vill du antagligen ha en relationsdelning. Vilket är fallet?id
inte är unikt kan det bara vara1
ELLER2
ELLER3
på en rad.