Ik heb een SQL-instructie nodig om de IN-operator te gebruiken binnen de items met ” En “verbonden.
SELECT * from tbl_Users WHERE id in [1,2,3]
is gelijk aan:
SELECT * from tbl_Users WHERE (id=1) or (id = 2) or (id = 3)
Wat ik nodig heb is genereren met de IN-operator (of equivalent):
SELECT * from tbl_Users WHERE (id=1) AND (id = 2) AND (id = 3)
Omdat ik alle IDs verzamel (bijv: [1,2,3,4,5]) in een string en zoek ermee in de database.
Meer uitleg:
ID is altijd een primaire sleutel
Het geval is dat ik een tabel heb met alle landen en elk land heeft verschillende elektrische normen in een aparte tabel.
Voorbeeld: Duitsland vereist altijd “standaard1” en “standaard2” VS vereist altijd “Standaard1” en “standaard3” Frankrijk vereist altijd “Standaard2”
Als de gebruiker in de C # -toepassing zoekt naar een land dat “Standard2” heeft, zou het systeem hem Duitsland en Frankrijk moeten geven.
MAAR Als de gebruiker wil landen met “Standard1” EN “standard2”, het systeem zou hem alleen Duitsland moeten geven. -> vanwege “AND”
Mijn zoekopdracht was
Select * from [tables and joins] where STANDARD_id IN [1,2]
[1,2] is een aaneengeschakelde lijst die de gebruiker al heeft gekozen uit een lijst met standaarden.
Opmerkingen
Antwoord
Ik denk dat wat u probeert te doen is relationele divisie . Hier is de beste uitleg die ik kon vinden
https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/
Eerlijk gezegd begrijp ik dit zelf nog niet helemaal, maar ik denk dat dit zou moeten werken (met een tussenliggende 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
Dit is gebaseerd op uw voorbeeld, maar Ik heb meer combinaties getest en het werkt als de becommentarieerde waarden worden gewijzigd.
Er zijn veel andere manieren om de indeling uit te voeren die wordt uitgelegd in de bovenstaande link – u moet degene gebruiken die het beste bij uw doeleinden past.
id
de primaire sleutel is, dan isWHERE (id=1) AND (id = 2) AND (id = 3)
retourneert 0 rijen. Altijd.id
niet de primaire of unieke sleutel is, dan wil je waarschijnlijk een relationele verdeling. Wat is het geval?id
niet uniek is, kan het alleen1
OF2
OF3
op een enkele rij.