2017-06-26 6 views
0

Vielleicht eine ziemlich einfache Frage, die eine ziemlich komplizierte Antwort zu haben scheint, die ich nicht ausgraben konnte.MSSQL SP: Wählen Sie alle Zeilen aus einer Tabelle mit IDs aus einem anderen

Im mit einem SQL-Server 2012.

Ich habe diese beiden Aussagen, die meine Daten alle auf einem Parameter basierend auswählt, und wählt dann auch bis zu fünf Zeilen an Daten (was bedeutet, dass keine Verknüpfungen) von einem anderen Tabelle basierend auf den IDs, die von der ersten Auswahl abgerufen wurden.

SELECT * FROM TBL1 WHERE XXX 
SELECT * FROM TBL2 
    WHERE TBL1_ID IN (SELECT ID FROM TBL1 WHERE XXX) 

Es scheint mir sehr redundant, dass ich meine TBL1 in meinem TBL2 wählen wiederholen Basicly und stattdessen würde Ich mag wissen, ob ich von TBL2 wählen können die IDs aus der * Daten unter Verwendung von I got TBL1.

Ich bin mir vollkommen bewusst, dass dies höchstwahrscheinlich in zwei Resultsets resultieren wird, die nicht unbedingt korrelieren, aber ich kann PHP-Array-Manipulation verwenden, um dies zu beheben, so dass es nicht so ein großer Deal ist.

+0

Es sieht überflüssig, aber eine andere Möglichkeit, komplexere einzige Weg sein wird. Wenn Sie sie nicht zusammenfügen und die Daten aus TBL1 zusammen mit den Daten von TBL2 auswählen möchten, rufen Sie statt zwei ein Dataset ab. – HoneyBadger

+0

@HoneyBadger Es mag komplexer sein, aber manchmal kann ich zwischen 0 und 10.000 Zeilen auswählen, was bedeutet, dass drei Auswahlen ziemlich entwässernd sind, verglichen mit nur zwei, die ich glauben würde. Wenn Sie sich über "Warum sollte er wählen 10.000 Zeilen und neu zu sein SPs", meine aktuelle Aufgabe bei der Arbeit hat mich schreiben SPs zu zeigen, ein Unternehmen, das die SP für uns schreiben sollte, wie wir wollen, die SPs funktionieren –

+0

In diesem Fall wird komplexer wahrscheinlich aller Wahrscheinlichkeit nach auch weniger performant, weniger sicher und/oder geradezu gefährlich sein. Ich verstehe nicht genau, warum man Performance-Tuning durchführen muss, wenn es nur darum geht, den Leuten, die den SP bauen, zu zeigen, welche Ergebnisse sie liefern sollten, das ist sicher ihre Aufgabe. Auch 10.000 Zeilen sind nicht viel, in Bezug auf die Datenbank würde ich mir darüber keine Sorgen machen. – HoneyBadger

Antwort

0

Mit IN:

Declare @T1 table (ID INT , Value VARCHAR(50)); 
Declare @T2 table (ID INT); 

INSERT INTO @T1 Values (1,'First') , (2,'Second'); 
INSERT INTO @T2 Values (1),(3); 

SELECT * FROM @T1 WHERE ID IN (SELECT ID FROM @T2); 

Resault:

ID   Value 
----------- ------------------------------------------------------------------------------ 
1   First 

Mit INNER JOIN:

SELECT T1.ID , T1.Value FROM @T1 T1 INNER JOIN @T2 T2 ON T1.ID = T2.ID; 

Resault:

ID   Value 
----------- ------------------------------------------------------------------------------ 
1   First 

Mit LEFT JOIN:

SELECT T1.ID , T1.Value FROM @T1 T1 LEFT JOIN @T2 T2 ON T1.ID = T2.ID 
WHERE T2.ID IS NOT NULL; 

Resault:

ID   Value 
----------- ------------------------------------------------------------------------------- 
1   First 
+0

Genau so habe ich meine eigene Version geschrieben ... Es gibt keinen Unterschied in deinem und meinem –

0

Sie auch EXISTS verwenden

SELECT * FROM TBL2 
    WHERE EXISTS (SELECT 1 FROM TBL1 WHERE TBL1.ID = TBL2.TBL1_ID AND XXX) 
Verwandte Themen