Announcement

Collapse
No announcement yet.

UNION ersetzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • UNION ersetzen

    Hallo zusammen!
    Ich habe ein SQL-Statement mit einem UNION drin. Das möchte gerne ersetzen, weil ich ein Problem mit einer Drittsoftware habe, die das UNION nicht verarbeiten kann. Anbei der Code:
    Code:
    SELECT 1 id, 'MW', round(nvl(SUM (l_laenge),0)/1000, 2) laenge, COUNT(DISTINCT(l.l_schachtoben)) schaechte FROM leitung l, einrichtung e, schacht s WHERE s.e_id = e.e_id AND e.e_name = l.l_schachtoben AND (l.L_ENTWAESSERUNG = 'Mischwasser' or l.L_ENTWAESSERUNG = 'KM' or l.L_ENTWAESSERUNG = 'DM' or l.L_ENTWAESSERUNG = 'GM' or l.L_ENTWAESSERUNG='MW') Union
    SELECT 2 id, 'RW', round(nvl(SUM (l_laenge),0)/1000, 2) laenge, COUNT(DISTINCT(l.l_schachtoben)) schaechte FROM leitung l, einrichtung e, schacht s WHERE s.e_id = e.e_id AND e.e_name = l.l_schachtoben AND (l.L_ENTWAESSERUNG = 'Regenwasser' or l.L_ENTWAESSERUNG = 'KR' or l.L_ENTWAESSERUNG = 'DR' or l.L_ENTWAESSERUNG = 'GR' or l.L_ENTWAESSERUNG='RW') union
    SELECT 3 id, 'SW', round(nvl(SUM (l_laenge),0)/1000, 2) laenge, COUNT(DISTINCT(l.l_schachtoben)) schaechte FROM leitung l, einrichtung e, schacht s WHERE s.e_id = e.e_id AND e.e_name = l.l_schachtoben AND (l.L_ENTWAESSERUNG = 'Schmutzwasser' or l.L_ENTWAESSERUNG = 'KS' or l.L_ENTWAESSERUNG = 'DS' or l.L_ENTWAESSERUNG = 'GS' or l.L_ENTWAESSERUNG='SW')
    Ist das irgenwie möglich oder beiße ich da auf Granit?

    Danke schonmal und beste Grüße

    dr_d00m

  • #2
    Man kann es vielleicht noch vereinfachen, aber wenn alle 3 'union' Fälle aus der gleichen Quelle stammen, reicht prinzipiell auch ein Select.

    aus
    [highlight=sql]
    SELECT 1 id, 'MW', round(nvl(SUM(l_laenge), 0) / 1000, 2) laenge,
    SELECT 3 id, 'SW', round(nvl(SUM(l_laenge), 0) / 1000, 2) laenge,
    SELECT 2 id, 'RW', round(nvl(SUM(l_laenge), 0) / 1000, 2) laenge,
    COUNT(DISTINCT(l.l_schachtoben)) schaechte
    FROM leitung l, einrichtung e, schacht s
    WHERE s.e_id = e.e_id
    AND e.e_name = l.l_schachtoben
    -- krit1:
    AND (l.L_ENTWAESSERUNG = 'Mischwasser' or l.L_ENTWAESSERUNG = 'KM' or
    l.L_ENTWAESSERUNG = 'DM' or l.L_ENTWAESSERUNG = 'GM' or
    l.L_ENTWAESSERUNG = 'MW')
    Union
    SELECT 2 id, 'RW', round(nvl(SUM(l_laenge), 0) / 1000, 2) laenge,
    COUNT(DISTINCT(l.l_schachtoben)) schaechte
    FROM leitung l, einrichtung e, schacht s
    WHERE s.e_id = e.e_id
    AND e.e_name = l.l_schachtoben
    -- krit2:
    AND (l.L_ENTWAESSERUNG = 'Regenwasser' or l.L_ENTWAESSERUNG = 'KR' or
    l.L_ENTWAESSERUNG = 'DR' or l.L_ENTWAESSERUNG = 'GR' or
    l.L_ENTWAESSERUNG = 'RW')
    union
    SELECT 3 id, 'SW', round(nvl(SUM(l_laenge), 0) / 1000, 2) laenge,
    COUNT(DISTINCT(l.l_schachtoben)) schaechte
    FROM leitung l, einrichtung e, schacht s
    WHERE s.e_id = e.e_id
    AND e.e_name = l.l_schachtoben
    -- krit3:
    AND (l.L_ENTWAESSERUNG = 'Schmutzwasser' or l.L_ENTWAESSERUNG = 'KS' or
    l.L_ENTWAESSERUNG = 'DS' or l.L_ENTWAESSERUNG = 'GS' or
    l.L_ENTWAESSERUNG = 'SW')
    [/highlight]

    wird ungefähr
    [highlight=sql]
    SELECT case l.L_ENTWAESSERUNG when --krit1 to krit3
    then --res 1 to 3
    as Id,
    case l.L_ENTWAESSERUNG when --krit1 to krit3
    then --res 'MW', 'SW', 'RW'
    as whatever,
    round(nvl(SUM(l_laenge), 0) / 1000, 2) laenge,
    COUNT(DISTINCT(l.l_schachtoben)) schaechte
    FROM leitung l, einrichtung e, schacht s
    WHERE s.e_id = e.e_id
    AND e.e_name = l.l_schachtoben
    AND (
    -- krit2:
    (l.L_ENTWAESSERUNG = 'Mischwasser' or l.L_ENTWAESSERUNG = 'KM' or
    l.L_ENTWAESSERUNG = 'DM' or l.L_ENTWAESSERUNG = 'GM' or
    l.L_ENTWAESSERUNG = 'MW')
    -- krit2:
    or (l.L_ENTWAESSERUNG = 'Regenwasser' or l.L_ENTWAESSERUNG = 'KR' or
    l.L_ENTWAESSERUNG = 'DR' or l.L_ENTWAESSERUNG = 'GR' or
    l.L_ENTWAESSERUNG = 'RW')
    -- krit3:
    or (l.L_ENTWAESSERUNG = 'Schmutzwasser' or l.L_ENTWAESSERUNG = 'KS' or
    l.L_ENTWAESSERUNG = 'DS' or l.L_ENTWAESSERUNG = 'GS' or
    l.L_ENTWAESSERUNG = 'SW')
    )
    [/highlight]
    das 'case' ist ggF auch wiederum durch db spezifische Statements anzupassen. Und die 'when--then' Ausdrücke musst Du natürlich einzeln für alle 3 ausformulieren. Im wesentlichen eine Wiederholung der 'or' Abschnitte der 'where' clause
    Gruß, defo

    Comment

    Working...
    X