Określanie, które wartości NIE pasują do wiersza tabeli


10

Chciałbym móc łatwo sprawdzić, które unikalne identyfikatory nie istnieją w tabeli, z tych dostarczonych w zapytaniu.

Aby lepiej to wyjaśnić, oto, co zrobiłbym teraz, aby sprawdzić, które identyfikatory z listy „1, 2, 3, 4” nie istnieją w tabeli:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4'), powiedzmy, że tabela nie zawiera wiersza o identyfikatorze 2.
  2. Zrzuć wyniki do Excela
  3. Uruchom WYSZUKAJ.PIONOWO na oryginalnej liście, która wyszukuje każdą wartość listy na liście wyników.
  4. Każda WYSZUKAJ.PIONOWO, której wynikiem #N/Ajest an, dotyczy wartości, która nie wystąpiła w tabeli.

Myślę, że musi być lepszy sposób na zrobienie tego. Idealnie szukam czegoś takiego

Lista do sprawdzenia -> Zapytanie do tabeli do sprawdzenia -> Członkowie listy nieobecni w tabeli


Nie każ nam zgadywać wersji SQL Server?
Aaron Bertrand


Przeprosiny. (edytowany) Jest stary. Problem z NOT IN polega na tym, że zwróci wszystko inne w tabeli ...
NReilingh

Odpowiedzi:


14

Użyj EXCEPT:

SELECT * FROM
  (values (1),(2),(3),(4)) as T(ID)
EXCEPT
SELECT ID 
FROM [TABLE];

Zobacz SqlFiddle .


valuesKonstruktor będzie działać tylko na SQL Server 2008 lub nowszym. Do 2005 r. Użyj

SELECT 'value'
UNION SELECT 'value'

jak szczegółowo opisano w tej odpowiedzi SO .


Ups, powinien był określić. Co jeśli ID jest varcharem?
NReilingh

1
@NReilingh następnie przeprojektuj swoją DB :), ale myślę, że powinna działać tak samo, myślę
JNK

Ciągle się dostaję Incorrect syntax near the keyword 'values'.podczas bieganiaSELECT * FROM (values ('search string'),('other string')) as T(ID)
NReilingh

Twoja składnia działa dla mnie dobrze w SQL Server 2008r2 - wkleiłem twój komentarz i uruchomił się.
JNK

Jestem w 2005 roku. Chrystus.
NReilingh

6

Zbudowałbym tabelę zmiennych lub tabelę tymczasową zawierającą identyfikatory, których szukasz ... następnie użyj rozwiązania Remusa, pomniejszonego o cukier syntaktyczny z 2008 roku:

declare @t table (ID int)
insert into @t values (1)
insert into @t values (2)
insert into @t values (3)
insert into @t values (4)
insert into @t values (5)

select ID from @t
except
select ID
from [Table];

3

Jestem teraz kilka lat mądrzejszy (i mam nowszy SQL Server) niż kiedy zadałem to pytanie, więc aby uczcić odznakę Znane Pytanie, które dostałem za to pytanie, oto co bym teraz zrobił. (Nie sądzę, żeby kiedykolwiek korzystałem z tego EXCEPToperatora.)

Powiedziałbym, że LEFT JOINponiższa metoda jest bardziej przydatna niż, EXCEPTponieważ można ją skomponować z innymi połączeniami bez potrzeby posiadania CTE.

SELECT v.val
  FROM (VALUES (1), (2), (3), (4), (5)) v (val)
    LEFT JOIN dbo.SomeTable t
      ON t.id = v.val
  WHERE t.id IS NULL;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.