Vad är rätt SQL för att använda var ID i List och objekten är med AND-operatorn

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

  • Om id är den primära nyckeln är WHERE (id=1) AND (id = 2) AND (id = 3) returnerar 0 rader. Alltid.
  • Om id inte är den primära eller unika nyckeln vill du antagligen ha en relationsdelning. Vilket är fallet?
  • Även om id inte är unikt kan det bara vara 1 ELLER 2 ELLER 3 på en rad.
  • antar jag nu kan vi stänga det som duplikat av: Sök inom samma ID på flera rader
  • Eller kanske den här, som har fler sätt att göra det och en titel som liknar titeln här: Gör IN-klausulen beter sig OCH klausul

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *