2017-08-10 15 views
1

Aus dem folgenden Datenskript möchte ich als Auswahlergebnis nur die letzte Kombination ('1111111113', 'viber') erhalten. Ich möchte die Temp-Tabelle durchsuchen und versuchen, Nummern zu finden, die nur mit einem Typ verwendet wurden (für mein Beispiel nur 'Viber').So erhalten Sie ein bestimmtes Ergebnis aus einer SQL-Tabelle

CREATE TABLE #temp 
(number NVARCHAR(MAX), 
[type] NVARCHAR(MAX) 
); 
INSERT INTO #temp 
VALUES 
('1111111111', 'tel'), 
('1111111111', 'tel'), 
('1111111111', 'viber'), 
('1111111111', 'viber'), 
('1111111111', 'tel2'), 
('1111111111', 'tel2'), 
('1111111112', 'tel'), 
('1111111112', 'tel'), 
('1111111112', 'tel2'), 
('1111111112', 'tel2'), 
('1111111113', 'viber'), 
('1111111113', 'viber'); 

Mein erster Gedanke war die folgende Auswahlabfrage

SELECT DISTINCT 
     * 
FROM #temp 
WHERE [type] = 'viber' 
     AND number NOT IN 
(
    SELECT number 
    FROM #temp 
    WHERE [type] <> 'viber' 
); 

Aber ich versuche, wenn zu finden es eine andere Art und Weise vielleicht effizienter als das ist. Mein Tisch wird Millionen von Daten enthalten, also muss ich sicher sein, dass das Ergebnis meiner Suche schnell genug ist.

Vielen Dank im Voraus.

PS. Dies ist mein erstes Mal, dass ich nach Jahren des Lesens etwas auf stackoverflow gepostet habe. Bitte entschuldigt mich, wenn ich etwas falsch gemacht habe.

Antwort

0

1. Option:

select distinct t1.number, t1.type 
from #temp t1 
where t1.number not in (select t2.number 
         from #temp t2 
         where t2.type <> t1.type) 

Ich bin nicht sicher, dies ist der beste Weg, aber man kann es selbst testen.

2. Option (sollte schneller sein):

select distinct t1.number, t1.type 
from #temp t1 
where not exists (select 1 
        from #temp t2 
        where t1.type <> t2.type 
         and t1.number = t2.number) 
0

Ich denke, Ihre Lösung zu Recht ist, ziehe ich zu einer Gruppe, anstatt verschiedene verwenden.

0

Angesichts der richtigen Indizes, dies ist schneller als die Unterauswahl in den anderen Antworten meiner Erfahrung nach.

SELECT DISTINCT 
     t1.* 
FROM #temp t1 
LEFT JOIN #temp t2 ON t1.type<>t2.type 
    AND t1.number=t2.number 
WHERE t2.type IS NULL 
Verwandte Themen