2017-01-13 3 views
0

Ich habe zwei Tabellen ersetzen:Wie einige Zeilen in einer SELECT-Abfrage von einer anderen SELECT

T1:

ID Department ATTRIBUTES TEAM 
--- ---------- ---------- ------ 
1  R&D   Dress_Code NULL 
2  R&D   Dress_Code Web 
3  R&D   Food  System 
4  R&D   Food  NULL 
5  R&D   Color  NULL 
6  Marketing Food  System 

T2:

ID VAL 
--- ---------- 
1  Smart 
2  Casual 
3  Beef 
4  Chicken 
5  Green 
6  Fish 

Der Zweck T1 ist alles zu zeigen, die Abteilung Attribute.

Wenn das TEAM null ist, ist es für alle in dieser Abteilung. Manchmal hat ein Team spezielle Einstellungen, die die generischen Einstellungen überschreiben.

Zum Beispiel möchte ich in R die Einstellungen als ‚Web‘ Team bekommen & D.

kann ich schreiben:

SELECT T1.DEPARTMENT, T1.ATTRIBUTES, T1.TEAM, T2.VAL 
FROM T1 
LEFT JOIN T2 ON T1.ID = T2.ID 
WHERE T1.DEPARTMENT = 'R&D' AND T1.TEAM = 'Web' 

Dieser Datensatz zeigen wird, die besagt, Kleiderordnung ist leger .

Aber ich will das Ergebnis sein:

ATTRIBUTES VAL 
---------- ------ 
Dress_Code Casual 
Food  Chicken 
Color  Green 

Ähnliches gilt für das 'System' Team in R & D, wäre das Ergebnis Kleiderordnung, Rindfleisch und grüne Farbe.

Ich denke zuerst wählen Sie alle R & D Ergebnisse und ersetzen Sie dann die Zeilen mit den oben ausgewählten Ergebnissen.

Ich muss dies als eine gespeicherte Prozedur schreiben.

Jede Hilfe wird sehr geschätzt!

+2

Können Sie die Logik der Übereinstimmung aufschreiben? Aufgrund der beiden Tabellen, die Sie geschrieben haben, kann ich nicht nachvollziehen, warum "Food-Attribute" mit "Chicken-Val" und nicht mit "Casual-Val" oder "Green-Val" übereinstimmen muss. – DVT

+0

Geben Sie Maxrecusion auch in Ihrem CTE an, um die Selbstschleife zu rekursiv zu machen. Das Maximum ist 32767 Standard ist 0 und wenn Sie nicht wissen, wie viel Ebene Sie auf Rekursion haben müssen, geben Sie 0 an. –

+0

@DVT Das Problem, das ich zu lösen versuchte, betrifft auch andere Zeilen und Spalten. Ich habe es wie gezeigt in T1 und T2 vereinfacht (obwohl es aussieht, als könnte ich sie einfach in eine einzige Tabelle setzen, kann ich das mit meinen Originaltabellen nicht machen). In diesem Fall stimme ich mit T1.ID = T2.ID überein. – Zelurd

Antwort

1

Mit CTE und row_number():

with CTE as(
    select 
     ATTRIBUTES, 
     VAL,     
     T1.TEAM, 
     row_number() over (partition by ATTRIBUTES order by team desc) rn 
    from t1 t1 
    inner join t2 t2 on t1.ID =t2.ID 
    AND ( T1.TEAM = 'Web' or T1.TEAM is null) 
) 
select 
    ATTRIBUTES , 
    VAL 
from cte where rn=1 
order by val 

OutPut:

enter image description here

+0

Funktioniert aber ein bisschen zu schlau. Ich brauche etwas Zeit zu verdauen :) +1 – Zelurd

+0

@Zelurd Google es. Führen Sie eine Zeile nach der anderen aus, die leicht zu verstehen ist. –

0
SELECT 
    T1.DEPARTMENT, 
    T1.ATTRIBUTES, 
    T1.TEAM, 
    T2.VAL 
INTO #temp 
FROM T1 
INNER JOIN T2 ON T1.ID = T2.ID 
WHERE T1.TEAM is NULL 

SELECT 
    T1.ATTRIBUTES, 
    T2.VAL 
INTO #t2 
FROM T1 
INNER JOIN T2 ON T1.ID = T2.ID 
WHERE T1.TEAM = 'Web' 

UPDATE t 
SET t.VAL=b.VAL 
FROM #temp t 
join #t2 b on b.ATTRIBUTES=t.ATTRIBUTES 

SELECT 
    DEPARTMENT,  
    ATTRIBUTES, 
    TEAM, 
    VAL 
FROM #temp 

Auch zu dieser helfen.

+0

Einfache Antwort :) +1 – Zelurd

Verwandte Themen