2016-09-02 2 views
1

Ich brauche eine SQL-Abfrage, die Datensätze aus mehreren Tabellen erhalten kann. Überprüfen Sie bitte das folgende Szenario -SQL-Abfrage, um durch mehrere Werte zu erfassen

Es gibt zwei Tabellen - Tabelle 1 und Tabelle 2

Unten ist die Abfrage.

Tabelle 1:

PID PName 
1  A 
2  B 

Table2: (Es gibt eine Fremdschlüsselbeziehung b/w Tabelle 1 und Tabelle 2 durch 'PID')

PPID PID RID 
101  1 222 
102  1 333 
103  2 001 
104  2 002 

Und ich Abfrage will, die Datensätze aus Tabelle 1 bekommen (ich brauche PName) und Tabelle 2 wie dass-

SELECT t1.PName FROM Table1 
INNER JOIN Table2 on t1.PID = t2.PID 
where t2.PID = '222' and t2.PID = '333' 

oder

SELECT t1.PName FROM Table1 
INNER JOIN Table2 on t1.PID = t2.PID 
INNER JOIN dbo.StringSplit('222,333', ',') AS t on t2.PID = t.item 

Aber in beiden Fällen bekomme ich nicht das richtige Ergebnis.

Ich möchte Datensätze, bei denen PID sollte sowohl RID des existiert für wie - 222 und 333

Der Ausgang so sein sollte -

PName 
    A 

Kann mir jemand helfen auf diese aus?

+0

Bitte geben Sie das erwartete Ergebnis ein. –

+0

Was Sie brauchen, ist nicht klar, bitte geben Sie als Beispiel die gewünschte Ergebnismenge an. – TJB

+0

# chris, TJB, ich habe meine Wunschausgabe hinzugefügt. – GreenSoft

Antwort

0

Ihre erste Abfrage liefert immer 0 Ergebnisse, da t2.PID nicht 222 und 333 gleich sein kann.

Wenn ich Ihre Frage richtig verstanden habe, wollen Sie die Ergebnisse enthalten, in dem PID ist 222OR333. Z.B.

SELECT t1.PName, t2.RID FROM Table1 
INNER JOIN Table2 on t1.PID = t2.PID 
where t2.PID = '222' OR t2.PID = '333' 
+0

#Chris, ich möchte Datensätze, wo PID sollte für beide RIDs wie - 222 und 333 – GreenSoft

0

Sie müssen LEFT JOIN:

SELECT t1.PName, t2.RID FROM Table1 t1 
LEFT JOIN table2 t2 
ON t1.PID = t2.PID 
WHERE t2.RID = '222' OR t2.RID = '333' 
0

Sie verschiedene

SELECT DISTINCT PNAME FROM dbo.Table1 
INNER JOIN dbo.Table2 ON Table11.PID = TABle22.PID 
WHERE rid IN ('222','333') 
2

eine häufig gestellte Frage Dies ist verwenden könnte. Es ist leicht, mit der Gruppierung zu tun:

select min(PName) as PName 
from Table1 t1 inner join Table2 t2 on t2.PID = t1.PID 
where t2.RID in ('222', '333') 
group by t1.PID 
having count(*) = 2 

Ihre Beispieldaten sind begrenzt und es ist nicht klar, was die Bedeutung der besonderen Werte „111“ und „222“. Abhängig von der tatsächlichen Beziehung möchten Sie vielleicht eine Variation wie count(*) >= 2 oder count(distinct t2.RID) = 2 stattdessen.

Btw, einige der anderen Antwort verwenden einen linken Join und dann Filterung auf der inneren Tabelle nachher in der where Klausel. Im Allgemeinen wäre das falsch, aber in Ihrem Fall würde es Ihre Ergebnisse nicht ändern, da die äußere Verknüpfung in erster Linie nicht relevant ist. Welche Lösung Sie auch wählen, verwenden Sie hier keinen äußeren Join.

+0

natürlich gibt es zwei Zeilen, wo RID = '222' oder '333' wird dies eine falsch positive zurückgeben. –

+0

@SeanLange Was ist, warum ich den Kommentar über 'count (distinct ...) hatte' – shawnt00

+1

Ahh ja verpasste diesen Kommentar ... da ist es klar als Tag. : D –

Verwandte Themen