2016-07-09 11 views
0

Ich weiß, dass der Wortlaut der Frage peinlich ist, aber ich könnte es nicht besser ausdrücken. Lassen Sie mich die Situation erklären.Kann ich doppelte Ergebnisse (aus einer Tabelle) in einer INTERSECT-Operation zwischen zwei Tabellen erhalten?

Es gibt Tabelle A, die eine Reihe von Spalten (a, b, c ...) und ich führen eine SELECT Abfrage es etwa so:

SELECT a FROM A WHERE b IN ('....') (die Auslassungspunkte eine Anzahl von Werten angibt zu sein abgestimmt auf)

gibt es einen anderen Tisch B, die eine Reihe von Spalten (d, e, f ...) und ich führen eine SELECT Abfrage es etwa so:

SELECT d FROM B WHERE f = '...' (die Auslassungszeichen zeigt einen einzelnen Wert zu angepasst werden)

Jetzt soll ich hier sagen, dass die beiden Tabellen speichern verschiedene Arten von Informationen über die gleiche Einheit, aber die Spalten a und d enthalten die genau dieselben Daten (in diesem Fall eine ID). Ich mag den Schnittpunkt der beiden Tabellen, um herauszufinden, so dass ich laufe diese:

SELECT a FROM A WHERE b IN ('....') INTERSECT SELECT d FROM B WHERE f = '...'

Hier ist das Problem:

Die erste SELECT enthält eine Reihe von Werten in der WHERE Klausel, nicht wahr? Nehmen wir an, das Set ist (1234, 2345, 3456). Nun ist das Ergebnis dieser Abfrage, wenn b NUR zu 1234 abgestimmt ist, sagen wir abc. Wenn es mit 2345 übereinstimmt, ist es def, angenommen. Und passend zu 3456 gibt es abc.

Nehmen wir an, diese beiden Ergebnisse (abc und def) sind auch in der Reihe der Ergebnisse von der zweiten SELECT.

So, nun setzte die gesamte Gruppe von Werten zurück zum abgestimmt in die WHERE Klausel, der INTERSECT Betrieb mir abc und def geben. Aber ich möchte abc zweimal, da zwei Werte in der WHERE Klausel gesetzt, um die zweite SELECT übereinstimmen.

Gibt es eine Möglichkeit, dass ich das bekommen kann?

Ich hoffe, es ist nicht zu kompliziert, mein Problem zu verstehen. Dies ist ein echtes Problem, dem ich in meinem Beruf gegenüber stehe.

Datenstruktur und mein Code

Tabelle A enthält allgemeine Informationen über ein Unternehmen:

company_id | branch_id | no_of_employees | city 

Tabelle B enthält die Finanzwerte des Unternehmens:

company_id | branch_id | revenue | profits 

Erste SELECT:

SELECT branch_id FROM A WHERE CITY IN ('Dallas', 'Miami', 'New Orleans')

nun jede Stadt separat im ersten SELECT läuft, bekomme ich die branch_id s:

branch_id | city 
     23 | Dallas 
     45 | Miami 
     45 | New Orleans 

Wieder einmal scheint dies nicht praktikabel, wie zwei Städte die gleichen Zweig-IDs haben kann, aber Bitte ertragen Sie mich dabei.

Zweiter SELECT:

SELECT branch_id FROM B 
WHERE REVENUE = 5000000 

Ich weiß, dass dies ein wenig unpraktisch ist, aber für den Zweck dieses Beispiels genügt es.

Ausführen dieser Abfrage ich den folgenden Satz erhalten:

11 
23 
45 
22 
10 

Also die INTERSECT wird mir nur 23 und 45. Aber ich will 45 zweimal, da sowohl Miami als auch New Orleans das branch_id haben und das branch_id einen Umsatz von 5 Millionen generiert hat.

+1

Wahrscheinlich einfacher zu sezieren, wenn Sie einen Beispieldatensatz bereitstellen könnten.Sie haben es ausführlich erklärt, aber jeder muss den Datensatz gemäß Ihrer Erklärung erstellen. Dies wird sicherstellen, dass wir Ihre Daten nicht vermasseln, obwohl es Testdaten sind. – scsimon

+1

Alter, beschreiben Sie keine Datensätze in Wörtern wie _ "hier ist der Wert A dann ein anderer Wert B und schließlich der Wert C" _. Es ist '(a, b, c)'. –

Antwort

3

direkt von der Microsoft-Dokumentation (https://msdn.microsoft.com/en-us/library/ms188055.aspx) : „liefert INTERSECT unterschiedlichen Zeilen, die ausgegeben werden sowohl von der linken und rechten Eingangs Operator fragt.“

Also NEIN, es ist nicht möglich, denselben Wert zweimal zu erhalten, wenn INTERSECT verwendet wird, da die Ergebnisse DISTINCT sind. Jedoch, wenn Sie eine INNER JOIN richtig erstellen, können Sie im Wesentlichen die gleiche Sache wie INTERSECT tun, außer halten Sie die sich wiederholenden Ergebnisse, indem Sie distinct oder group by nicht verwenden.

SELECT 
    A.a 
FROM 
    A 
    INNER JOIN B 
    ON A.a = B.d 
    AND B.F = '....' 
WHERE b IN ('....') 

Und für Ihr spezifisches Beispiel, die Sie bearbeitet:

SELECT 
    branch_id 
FROM 
    A 
    INNER JOIN B 
    ON A.branch_id = B.branch_id 
    AND B.REVENUE = 5000000 
WHERE A.CITY IN ('Dallas', 'Miami', 'New Orleans') 
2

Sie zu kompliziert Ihre Aufgabe viel:

SELECT * 
FROM A 
WHERE CITY IN (...) 
    AND EXISTS 
    (
     SELECT 1 FROM B 
     WHERE B.REVENUE = 5000000 
     AND B.branch_id = A.branch_id 
    ) 

INTERSECT und EXCEPT sind beide Rückkehr Reihe Sätze mit DISTINCT angewandt. Reguläre Verbindungs-/Filteroperationen werden nicht von INTERSECT oder EXCEPT ausgeführt.

Verwandte Themen