wake-up-neo.com

Verknüpfen einer Liste von Werten mit Tabellenzeilen in SQL

Angenommen, ich habe eine Liste von Werten wie 1, 2, 3, 4, 5 und eine Tabelle, in der einige dieser Werte in einer Spalte vorhanden sind. Hier ist ein Beispiel:

id  name
 1  Alice
 3  Cindy
 5  Elmore
 6  Felix

Ich möchte eine SELECT-Anweisung erstellen, die alle Werte aus meiner Liste sowie die Informationen aus den Zeilen enthält, die mit den Werten übereinstimmen, d. H. Einen LEFT OUTER JOIN zwischen meiner Liste und der Tabelle ausführen. Das Ergebnis wäre also wie folgt:

id  name
 1  Alice
 2  (null)
 3  Cindy
 4  (null)
 5  Elmore

Wie mache ich das, ohne eine temporäre Tabelle zu erstellen oder mehrere UNION-Operatoren zu verwenden?

19
uncoder

Wenn Sie sich in Microsoft SQL Server 2008 oder höher befinden, können Sie Table Value Constructor verwenden.

 Select v.valueId, m.name 
 From (values (1), (2), (3), (4), (5)) v(valueId)
     left Join otherTable m
        on m.id = v.valueId

Ich weiß nicht, ob Oracle eine ähnliche Konstruktion hat

34
Charles Bretana

die folgende Lösung für Oracle wird aus dieser Quelle übernommen. Die Grundidee besteht darin, die hierarchischen Abfragen von Oracle zu nutzen. Sie müssen eine maximale Länge der Liste angeben (100 in der Beispielabfrage unten).

   select d.lstid
        , t.name
     from (
               select substr(
                           csv
                         , instr(csv,',',1,lev) + 1
                         , instr(csv,',',1,lev+1 )-instr(csv,',',1,lev)-1
                      )  lstid
                 from (select ','||'1,2,3,4,5'||',' csv from dual)
                    , (select level lev from dual connect by level <= 100)
                where lev <= length(csv)-length(replace(csv,','))-1         
          ) d
left join test  t on ( d.lstid = t.id )
        ;

check out diese SQL-Geige um zu sehen, wie es funktioniert.

4
collapsar

Etwas spät dran, aber für Oracle könnten Sie so etwas tun, um eine Wertetabelle zu erhalten:

SELECT rownum + 5 /*start*/ - 1 as myval
FROM dual
CONNECT BY LEVEL <= 100 /*end*/ - 5 /*start*/ + 1

... und füge das dann zu deinem Tisch hinzu:

SELECT *
FROM
(SELECT rownum + 1 /*start*/ - 1 myval
FROM dual
CONNECT BY LEVEL <= 5 /*end*/ - 1 /*start*/ + 1) mypseudotable
left outer join myothertable
    on mypseudotable.myval = myothertable.correspondingval
2
EdmCoff

Angenommen, myTable ist der Name Ihrer Tabelle. Der folgende Code sollte funktionieren.

;with x as 
(
  select top (select max(id) from [myTable]) number from [master]..spt_values
),
y as
(select row_number() over (order by x.number) as id
from x)
select y.id,  t.name
from y left join myTable as t
on y.id = t.id;

Achtung: Dies ist die SQL Server-Implementierung.

Geige

1
user353gre3

Angenommen, Ihre Tabelle mit den Werten 1,2,3,4,5 hat den Namen list_of_values. Angenommen, die Tabelle enthält einige Werte, die Namensspalte lautet jedoch some_values. Sie können Folgendes tun:

SELECT B.id,A.name
FROM [list_of_values] AS B
LEFT JOIN [some_values] AS A
ON B.ID = A.ID
0
xbb

So erhalten Sie sequentielle Nummern für einen Teil der Ausgabe (Diese Methode eliminiert Werte, die für n-Nummern eingegeben werden sollen):

declare @site as int
set @site = 1
while @site<=200
begin
insert into ##table
values (@site)

set @[email protected]+1
end

Endgültige Ausgabe [Beitrag über Schritt]: 

select * from ##table
select v.id,m.name from  ##table  as v
left outer join [source_table] m
 on m.id=v.id
0
Amarnadh