Re: Union Abfrage

From: Thomas Markus <t(dot)markus(at)proventis(dot)net>
To: "pgsql-de-allgemein(at)postgresql(dot)org" <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Re: Union Abfrage
Date: 2012-07-27 11:29:23
Message-ID: 50127B93.7000304@proventis.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Hi,

ich tippe mal du möchtest das Endergebnis sortieren.

also eher

select * from
(
select ....
union
select ...
union
select ...
) a
order by ...

und soll es wirklich ein union sein oder ein union all? union macht ein
distinct

Gruss
Thomas

Am 27.07.2012 12:08, schrieb Gülümser Köroglu:
>
> Hallo nochmals,
>
> ich habe folgendes Problem und bitte euch mir weiterzuhelfen.
>
> Ich habe 3 Tabellen aus denen ich mit 3 Abfragen (verknüpft mit Union)
> eine Abfrage erstellt habe.
>
> Wichtig ist hierbei, dass ich 50 rows ziehe, diese aber sortiert nach
> Datum sein müssen.
>
> Folgende Abfrage:
>
> (SELECT me.EventName as "EventName" , CASE WHEN meh.isStarted = true
> THEN 'Started' else 'Stopped' END as "Action" , meh.ActionTime, '' as
> "Related Device", '' as "Details"
> FROM ManagedEvent me, ManagedEventActionHistory meh
> WHERE me.Event_id = meh.Event_id AND me.EventName ~* ''
> AND meh.ActionTime >= '18.07.2012 21:00:00.000'
> AND meh.ActionTime < '27.07.2012 09:04:00.000'
> ORDER BY meh.ActionTime DESC LIMIT 50 OFFSET 0)
>
> UNION
> ( SELECT EventName , CASE WHEN Action = 0 THEN 'Started' When Action
> = 1 THEN 'Stopped' else 'Transferred' END as Action ,ActionTime ,
> RelatedDevice as "Related Device" ,'' as "Details"
> FROM EventActionHistory WHERE EventName ~* ''
> AND ActionTime >= '18.07.2012 21:00:00.000'AND ActionTime <
> '27.07.2012 09:04:00.000'
> ORDER BY ActionTime DESC LIMIT 50 OFFSET 0 )
>
> UNION
> (
> SELECT m.eventname, CASE WHEN Action = 0 THEN 'Disabled' END as
> Action, h.ActionTime, '' as "Related Device" , h.User_id || ' for ' ||
> h.Timespan ||' seconds' as "Details"
> FROM UserManagedEventActions h, ManagedEvent m
> where h.ActionTime >= '18.07.2012 00:00:00'
> AND h.ActionTime < '27.07.2012 00:00:00'
> AND (h.User_id IN (SELECT User_id FROM Users WHERE User_id ~* '' AND
> IsDeleted = false))
> AND m.event_id = h.managedevent_id
> ORDER BY h.ActionTime DESC LIMIT 50 OFFSET 0
> )
>
> ORDER BY ActionTime DESC LIMIT 50
> ?
>
> Ausgabe:
>
> 1."test";"Started";"2012-07-23 06:53:37.412";"test";""
> 2."test";"Started";"2012-07-23 06:35:37.483";"test";""
> 3."test";"Started";"2012-07-23 06:22:29.248";"test";""
> 4."test2";"Started";"2012-07-19 09:05:10.195";"";""
> 5."test2";"Disabled";"2012-07-19 09:05:04.993";"";"hanife for 5 seconds"
> 6."test2";"Stopped";"2012-07-19 09:05:03.889";"";""
>
>
> Diese Abfrage liefert mir eine falsche Ausgabe. Der erste Select wird
> 'abgebrochen' und Daten von den anderen Tabellen angehaengt. (obwohl
> zeitlich gesehen die rows aus der ersten Tabelle erscheinen sollten)
>
> Zwischen der 3. und 4. sollten noch Rows von der (hier im Beispiel)
> ersten Tabelle erscheinen.
>
> Schlechter workaround waere, wenn ich die inneren limits höher setze.
> Aber das ist riskant und falsch, da immer noch falsche Ausgaben
> geliefert werden.
>
> Die internen Select-Abfragen muss ich ebenfalls limitieren (nach
> meinem SQL-Wissensstand :)), da von Mio von Rows die Daten gezogen
> werden und somit die Abfrage lange dauert.

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Thomas Uzunoff 2012-08-02 15:10:15 Primärschlüssel von integer auf bigint ändern
Previous Message Andreas Kretschmer - internet24 GmbH 2012-07-27 10:34:21 Re: Union Abfrage