2016-08-04 8 views
-1

Ich habe 1000 Zeilen, in denen ich überprüfen möchten, ob diese Datensätze in der Tabelle verlässt alsSQL Server: Filterung obwohl große Menge von Daten

select * 
from table 
where ID in ('TS145698', 'TF58964', 'TG47896', 'TS12369') 

folgt Wenn ich 1000 IDs eingeben, ich Abrufen von Daten für 786, Woher weiß ich, welche der 214 IDs sich nicht in der Tabelle befinden?

+2

Diese 1000 IDs in eine temporäre Tabelle einfügen. NICHT VORHANDEN. – jarlh

+0

Und wenn Sie NULL für die ID nicht interessiert, dann NICHT IN. – DVT

Antwort

1

Sie können mit einer Vorlage Tabelle.

DECLARE @Template TABLE (ID NVARCHAR(50)) 

INSERT INTO @Template 
VALUES 
('TS145698'), 
('TF58964'), 
('TG47896'), 
('TS12369') 

SELECT * 
FROM 
    @Template A LEFT JOIN 
    table B ON A.ID = B.ID 
WHERE 
    B.ID IS NULL 
+0

wenn ich das in Excel filtern musste, anstatt eine temp_table zu erstellen? – doe

+0

@doe Sorry Was meinst du? – NEER

+0

Ich denke nur, es wäre einfacher, wenn ich die Aufzeichnungen nehme, die ich habe und versuche, sie in Excel zu vergleichen? – doe

0

Haben Sie bedeuten, dass:

select * from table where ID not in 
      ('TS145698' 
      ,'TF58964' 
      ,'TG47896' 
      ,'TS12369' 
      ) 
+0

Ich versuchte dies, aber es einfach weiter ausgeführt und gibt mir mehrere Daten, die mehr als 214 Datensätze ist, gibt es mir zurück wie 20 000 Zeilen – doe

+0

@ Doe - also muss Ihre Tabelle mehr als 1000 Datensätze insgesamt haben. Sagen Sie, dass Sie eine bestimmte 1000 Datensätze haben, und Sie möchten wissen, welche von denen nicht in der Liste der IDs sind? In diesem Fall müssen Sie die 1000 auswählen, dann ... UND wo ID nicht in ... usw. – Cato

+0

zuerst wollte ich überprüfen, welche Ids in der Tabelle sind, mit der In-Klausel weiß ich jetzt, welche sie sind, wie auch immer Jetzt weiß ich nicht, welche nicht in der Liste der 1000 IDs sind, die ich filtere für – doe

1

Sie können nach Kriterien Werte schaffen Tabelle, und dann links zur Haupt Join-Tabelle machen:

SELECT A.*, B.* 
FROM [YourCriteriasTable] AS A 
LEFT JOIN [table] AS B ON A.ID = B.ID 

und den gewünschten ID-s wird Null-Werte in B haben. * Felder.

1

Eine Möglichkeit besteht darin, diese Werte in einen Tabellenparameter, eine CTE oder eine temporäre Tabelle einzugeben und dann den linken Join mit der tatsächlichen Tabelle zu verwenden. Eine weitere Möglichkeit besteht darin, die Werte Klausel zu verwenden:

Erstellen und Probentisch (Bitte speichern uns diesen Schritt in Ihrer zukünftigen Fragen)

DECLARE @T as TABLE 
(
    Id int 
) 

INSERT INTO @T VALUES (1), (2), (3), (4) 

Die Abfrage füllen:

SELECT v.Id 
FROM (VALUES (1), (2), (3), (5), (6)) AS v(Id) -- Use this instead of the IN operator 
LEFT JOIN @T T ON v.Id = T.Id 
WHERE T.Id IS NULL 

Ergebnisse :

Id 
----------- 
5 
6 

Eine weitere Option ist UNION, um Ihre Werte zu erstellen:

SELECT v.Id 
FROM (
    SELECT 1 As Id 
    UNION 
    SELECT 2 
    UNION 
    SELECT 3 
    UNION 
    SELECT 4 
    UNION 
    SELECT 5 
    UNION 
    SELECT 6 
) AS v -- Use this instead of the IN operator 

LEFT JOIN @T T ON v.Id = T.Id 
WHERE T.Id IS NULL 
+0

Ich habe eine 1000 IDs zu filtern – doe

+0

1000 oder 5 spielt keine Rolle. Sie müssen diese Werte als Datenquelle verwenden. Verwenden Sie also entweder eine temporäre Tabelle, eine Tabellenvariable, eine values-Klausel, eine cte oder eine abgeleitete Tabelle. Ich hätte die Tabelle variable Version enthalten, aber Neer war schneller als ich. –

Verwandte Themen