2016-06-17 6 views
2

In SQL gibt es eine Möglichkeit, Zeilen hinzuzufügen, die nicht vorhanden sind (basierend auf bestimmten Kombinationen).Wie füge ich Kombinationswerte hinzu, wenn Zeilen nicht existieren?

Alle Zeilen ohne Werte:

Col-a Col-a 
Col-a Col-b 
Col-a Col-c 
... 

Die Datenbank:

Col-a Col-a Val-a 
Col-a Col-b Val-b 
Col-b Col-a Val-c 
Col-b Col-b Val-d 
... 

eine Reihe Angenommen mit Col-a Col-c nicht in db gibt, möchte ich Col-a, Col-c, 0 hinzufügen Das ist nur die fehlende Zeile mit einem Nullwert einfügen.

Beispiel:

1,1,50 
1,2,100 
2,2,100 

So, hier sind wir 2,1 fehlt daher 2,1,0 hinzuzufügen. Ich gebe eine Menge [1,2], wo Werte für beide vorhanden sein sollten.

Erwartete Ausgabe:

1,1,50 
1,2,100 
2,1,0 
2,2,100 

Gibt es eine einfache Möglichkeit, das zu tun?

+1

Woher kam 'Col-a Col-a',' Col-a Col-b', 'Col-a Col-c'? – Blank

+0

Sie könnten den beiden Spalten eine eindeutige Integritätsregel hinzufügen und den Standardwert für die Zahl 0 festlegen. –

+0

Was fehlt, fehlt '123'? – Serg

Antwort

0

Sie sollten sie setzen in "Vereinigung" ..

select '' col-a, '' col-b, '' col-c, [null your_table.fields] 
union 
select '' col-a, '' col-b, '' col-c, your_table.* 
from your_table 



Update nach Kommentaren und die Lichtung in der ursprünglichen Frage:

Sie könnten diese SQL-Anweisung versuchen. .

select THeaders.col_a, THeaders.col_b, TSrcValues.col_c 
from 
(
    select 1 as col_a, 1 as col_b, 0 as col_c from dual 
    union 
    select 1 as col_a, 2 as col_b, 0 as col_c from dual 
    union 
    select 1 as col_a, 3 as col_b, 0 as col_c from dual 
    union 
    select 2 as col_a, 1 as col_b, 0 as col_c from dual 
    union 
    select 2 as col_a, 2 as col_b, 0 as col_c from dual 
    union 
    select 2 as col_a, 3 as col_b, 0 as col_c from dual 
)THeaders 
left join 
(
    select TSrc.* 
    from 
    (
    select 
    case when YourValue = 100 then 1 else case when YourValue = 200 then 2 else case when YourValue = 300 then 3 else 0 end end end col_a, 
    case when YourValue = 100 then 1 else case when YourValue = 200 then 2 else case when YourValue = 300 then 3 else 0 end end end col_b, 
    YourValue as col_c 
    from YourTable 
) TSrc 
    where TSrc.col_a <> 0 or TSrc.col_b <> 0 
) TSrcValues 
on THeaders.col_a = TSrcValues.col_a and THeaders.col_b= TSrcValues.col_b 
; 

sollten Sie Ihre Wertebereiche in den "case when" -Klauseln personalisieren

+0

col-a, colb sollte nur aus einem Satz wie [1,2,3] und Kombinationen wie (1,1) oder (1,2) usw. ausgewählt werden. – Emily

+0

Benötigen Sie nur eine Tabelle von col-a und col-b mag so: 1, 1 | 1, 2 | 1, 3 | 2, 1 | 2, 2 | 2, 3 | ? –

+0

Ja, das wollte ich. – Emily

0

Ihr Beispiel benötigt mehr Klarheit. Aber wenn ich Sie richtig verstehe, müssen Sie alle die einzigartigen Werte der ersten Spalte finden und es mit allen eindeutigen Werten der zweiten Spalte zu verbinden, und die Zeile einfügen, wenn diese Kombination nicht existiert:

INSERT INTO foo (col1, col2, value) 
SELECT a.col1, b.col2,0 
FROM (SELECT DISTINCT col1 FROM foo) AS a 
JOIN (SELECT DISTINCT col2 FROM foo) AS b 
LEFT JOIN foo 
    ON a.col1 = foo.col1 
    AND b.col2 = foo.col2 
WHERE foo.value IS NULL; 

Here is a SQLFiddle zeigt die SELECT-Komponente funktioniert

+0

Nicht was ich wollte, danke trotzdem. Ich wollte 1,1 | 1,2 | 2,1 | 2,2 .. wie (1,1 oder 1,2), wenn einer dieser Zeilen ein Wert in der dritten Spalte fehlt Ich möchte nur, dass es 0 ist. – Emily

Verwandte Themen