2017-04-14 5 views
-2

I 4 Fragen haben, beginnt jeweils mit einem CTE:Wie erhalten Sie das Ergebnis mit einer einzigen CTE?

with stg as 
(
    select columns 
    from stage 
    where conditions1 
) 

dies Nachdem die Unterschiede beginnen. Im ersten Fall muss ich mich mit 2 Tabellen unter bestimmten Bedingungen verbinden.

In zweiter. Ich muss table2 beitreten, aber auf verschiedenen Bedingungen

select cols 
from stg 
inner join table2 on cond5 
where cond6 

Im dritten, ich brauche einfach alle Spalten, die

select cols 
from stg 
where cond7 

passen cond7 Und in der vierten, wieder andere Tabelle und cond

select cols 
from stg 
left join table3 on cond8 
where cond9 

Die Sache ist, nach jeder Abfrage muss ich geänderte Daten zurück einfügen. Es ist im Grunde

insert into table stage 
    select * 
    from query(1-4) 

Also kann ich diese CTEs nicht verketten. Und nach jedem Einfügen gibt der CTE weniger Zeilen zurück. Zum Beispiel

Zum ersten Mal gibt es 100 Zeilen, Sekunde 85 und so weiter. Was ich will ist, den CTE nur einmal zu benutzen. Zuerst dachte ich, über das Ändern alle Join nach links, und fügte hinzu, sie zu dem CTE selbst und die Schaffung einer Flagge von Sorten

with stg as 
(
    select 
     cols, 
     table1.col as flag1, 
     table2.col as flag2, 
     table3.col as flag3 
    from 
     stage 
    left join 
     table1 on cond 
    left join 
     table2 on cond 
    left join 
     table3 on cond 
    where 
     many conditions 
) 

Aber das erwies sich als sehr chaotisch, sehr schnell und nicht einmal richtig arbeiten. Dann habe ich überlegt, es tatsächlich zu verketten und dann 4 CTEs zu verbinden, um loszuwerden, wenn sie verdoppelt werden, wenn sie existieren. Aber auch das scheint keine kluge Wahl zu sein. Gibt es noch andere Varianten?

+1

Zum Schließen geschlossen. Diese Frage ist ein Durcheinander. Was hat der Einsatz von CTE mit Dubletten in Ihren Ergebnissen zu tun? Wickeln Sie es in eine Unterabfrage ein und verwenden Sie distinct –

+1

Ihre Beispiele sind zu abstrakt und beleuchten Ihr Problem nicht viel. Realistischere Abfragen mit Beispieldaten wären hilfreich. –

Antwort

0

Wenn cols das gleiche für alle 4-Abfragen, die Sie

Q1 
union all 
Q2 
union all 
Q3 
union all 
Q4 

UPDATE verwenden können: entfernen Duplikate union anstelle von union all

UPDATE2: Wenn union all nicht unterstützt wird, können wir distinct + subquery

verwenden
select distinct * 
from (Q1 
     union all 
     Q2 
     union all 
     Q3 
     union all 
     Q4) sub 
+0

@Dies wird viele Doppel zurückgeben. –

+0

Die Antwort aktualisiert – StanislavL

+0

Nur aus Gründen der Vollständigkeit: Hive-Versionen vor 1.2.0 unterstützen nur UNION ALL – spijs

0

können Sie haben multple CTE separetad mit einem Komma

WITH cte1 AS (SELECT ... FROM ...), 
    cte2 AS (SELECT ... FROM cte1 INNER JOIN ...), 
    cte3 AS (SELECT ... FROM cte2 INNER JOIN ...) 

SELECT * FROM cte3 
+0

Ich weiß, aber wie hilft mir das? Die Bedingungen sind unterschiedlich und sogar widersprüchlich. Also cte to wird zurückgeben, was ich für die erste Abfrage brauche, aber in cte3 gibt es eine Bedingung, die nur alle Zeilen von cte2 filtert und umgekehrt. Cte 3 gibt die Zeilen zurück, die ich brauche, aber eine andere wird alle PR-Hälfte von ihnen filtern. –

Verwandte Themen