Jaki jest poprawny SQL do użycia gdzie ID na liście i elementy są z operatorem AND

Potrzebuję instrukcji SQL, aby użyć operatora IN w elementach z ” I „połączony.

SELECT * from tbl_Users WHERE id in [1,2,3] 

to odpowiednik:

SELECT * from tbl_Users WHERE (id=1) or (id = 2) or (id = 3) 

Potrzebuję do generowania za pomocą operatora IN (lub jego odpowiednika):

SELECT * from tbl_Users WHERE (id=1) AND (id = 2) AND (id = 3) 

Ponieważ zbieram wszystkie identyfikatory (np .: [1,2,3,4,5]) w jednym ciągu i wyszukaj go w bazie danych.

Więcej wyjaśnień:

ID jest zawsze kluczem podstawowym

W przypadku, gdy mam tabelę zawierającą wszystkie kraje, a każdy kraj ma kilka standardów elektrycznych w osobnej tabeli.

Przykład: Niemcy wymagają zawsze „standard1” i „standard2”. USA wymagane zawsze „Standard1” i „standard3” Francja wymagane zawsze „Standard2”

Jeśli użytkownik w aplikacji C # wyszukuje hasło kraj, który ma „Standard2”, system powinien dać mu Niemcy i Francję.

ALE Jeśli użytkownik chce mieć kraje ze „Standard1” ORAZ „Standard2”, system powinien podać mu tylko Niemcy. -> z powodu „AND”

Moje zapytanie to

Select * from [tables and joins] where STANDARD_id IN [1,2] 

[1,2] to połączona lista, którą użytkownik już wybrał z listy standardów.

Komentarze

  • Jeśli id jest kluczem podstawowym, to WHERE (id=1) AND (id = 2) AND (id = 3) zwróci 0 wierszy. Zawsze.
  • Jeśli id nie jest kluczem podstawowym ani unikalnym, prawdopodobnie potrzebujesz podziału relacyjnego. Co tak jest?
  • Nawet jeśli id nie jest unikalne, może być tylko 1 LUB 2 LUB 3 w dowolnym pojedynczym wierszu.
  • Chyba teraz możemy go zamknąć jako duplikat: Wyszukaj w tym samym identyfikatorze w kilku wierszach
  • A może ten, który ma więcej możliwości i tytuł, który przypomina tytuł tutaj: Make IN zachowuje się jak klauzula AND

Answer

Myślę, że to, co próbujesz zrobić, to podział relacyjny . Oto najlepsze wyjaśnienie, jakie udało mi się znaleźć.

https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/

Szczerze, sam jeszcze tego nie rozumiem, ale uważam, że powinno to działać (przy użyciu tabeli pośredniej):

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 

Jest to oparte na Twoim przykładzie, ale Przetestowałem więcej kombinacji i działa, jeśli wartości komentowane zostaną zmienione.

Jest wiele innych sposobów podziału wyjaśnionych w powyższym linku – powinieneś użyć tego, który najlepiej pasuje do twoich celów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *