29 Stimmen

SQL Server: Wie kann man UNION mit zwei Abfragen verwenden, die beide eine WHERE-Klausel haben?

Gegeben:

Zwei Abfragen, die gefiltert werden müssen:

select top 2 t1.ID, t1.ReceivedDate
  from Table t1
 where t1.Type = 'TYPE_1'
 order by t1.ReceivedDate desc

Und:

select top 2 t2.ID
  from Table t2
 where t2.Type = 'TYPE_2'
 order by t2.ReceivedDate desc

Getrennt davon geben diese die ID s, die ich suche: (13, 11 und 12, 6)

Im Grunde möchte ich die beiden jüngsten Datensätze für zwei bestimmte Datentypen.

Ich möchte diese beiden Abfragen folgendermaßen zusammenführen:

select top 2 t1.ID, t2.ReceivedDate
  from Table t1
 where t1.Type = 'TYPE_1'
 order by ReceivedDate desc
union
select top 2 t2.ID
  from Table t2
 where t2.Type = 'TYPE_2'
 order by ReceivedDate desc

Problem:

Das Problem ist, dass diese Abfrage ungültig ist, weil die erste select kann nicht über eine order by Klausel, wenn es sich um unioned . Und es kann nicht haben top 2 ohne dass die order by .

Wie kann ich diese Situation beheben?

0voto

Pavel Nefyodov Punkte 876

Erstellen Sie Ansichten auf zwei erste "selects" und "union" sie.

0voto

Pradeep atkari Punkte 539

Beachten Sie, dass jede SELECT-Anweisung innerhalb der UNION dieselbe Anzahl von Spalten haben muss. Die Spalten müssen außerdem ähnliche Datentypen haben. Außerdem müssen die Spalten in jeder SELECT-Anweisung in der gleichen Reihenfolge stehen. Sie wählen aus

t1.ID, t2.ReceivedDate aus Tabelle t1

Gewerkschaft

t2.ID aus Tabelle t2

was falsch ist.

Sie müssen also schreiben

t1.ID, t1.ReceivedDate aus Tabelle t1 union t2.ID, t2.ReceivedDate aus Tabelle t1

Sie können hier eine Unterabfrage verwenden

 SELECT tbl1.ID, tbl1.ReceivedDate FROM
      (select top 2 t1.ID, t1.ReceivedDate
      from tbl1 t1
      where t1.ItemType = 'TYPE_1'
      order by ReceivedDate desc
      ) tbl1 
 union
    SELECT tbl2.ID, tbl2.ReceivedDate FROM
     (select top 2 t2.ID, t2.ReceivedDate
      from tbl2 t2
      where t2.ItemType = 'TYPE_2'
      order by t2.ReceivedDate desc
     ) tbl2 

so dass standardmäßig nur eindeutige Werte aus beiden Tabellen zurückgegeben werden.

0voto

Select top 2 t1.ID, t2.ReceivedDate, 1 SortBy aus Tabelle t1 wo t1.Typ = 'TYP_1' Vereinigung wähle die obersten 2 t2.ID, 2 SortBy von Tabelle t2 wo t2.Typ = 'TYPE_2' Reihenfolge nach 3,2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X