Bookmarks

Yahoo Gmail Google Facebook Delicious Twitter Reddit Stumpleupon Myspace Digg

Search queries

sqldatasource dal, wwwxxxenden, convert raid5 to raid 10 mdadm, apache force chunked, nrao wwwxxx, xxxxxdup, procmail change subject header, wwwXxx not20, Wwwxxx.doks sas, linux raid resync after reboot

Links

XODOX
Impressum

#1: Optimierungsfrage

Posted on 2008-04-18 05:45:11 by Andreas Born

Hallo,

ich habe eine Frage zu einem sql-statement.

Und zwar will ich mir alle Datensätze einer Tabelle ausgeben, die in
einem Feld einen Wert haben, der in mehr als nur diesem Datensatz
vorkommt.

Zur veranschaulichung:

t: R1 R2
1 a
2 b
3 b
4 c
5 d
6 e
7 e
8 e
9 f

gewünschtes Ergebnis:

r: R1 R2 cnt
2 b 2
3 b 2
6 e 3
7 e 3
8 e 3

Aktuell löse ich das mit einem join auf einen subquery:

select t.R1,t.R2,t2.cnt
from t left join (select
R2, count(*) as cnt from t group by R2 having cnt > 1
) as t2 on t.R2 = t2.R2
where t2.R2 is not null
order by t2.cnt,R1,R2


Geht das evtl. einfacher, d.h. ohne subquery?



Viele Grüße,
Andreas

Report this message

#2: Re: Optimierungsfrage

Posted on 2008-04-18 10:12:30 by Harald Stowasser

Andreas Born schrieb:
> Hallo,
>
> ich habe eine Frage zu einem sql-statement.
>
> Und zwar will ich mir alle Datensätze einer Tabelle ausgeben, die in
> einem Feld einen Wert haben, der in mehr als nur diesem Datensatz vorkommt.
....
> Aktuell löse ich das mit einem join auf einen subquery:
>
> select t.R1,t.R2,t2.cnt
> from t left join (select
> R2, count(*) as cnt from t group by R2 having cnt > 1
> ) as t2 on t.R2 = t2.R2
> where t2.R2 is not null
> order by t2.cnt,R1,R2
>
>
> Geht das evtl. einfacher, d.h. ohne subquery?

wenn es Dir reicht in der Application R1s zu zerpfücken:

SELECT GROUP_CONCAT(t.R1) AS R1s,t.R2,count(*) AS cnt
FROM t
GROUP BY R2
HAVING cnt > 1
ORDER BY cnt,R1s,R2

Having hat ausreichend Performance wenn du viele cnt >1 hast.
Eventuell könnte ein X-Join auch performanter sein (vorraussetzung
passender index über R2 und R1) Achtung einige R1 kommen hier evtl.
doppelt:

SELECT GROUP_CONCAT(t.R1) AS R1s,t.R2,count(*) AS cnt
FROM t, t as t2
WHERE t.R2=t2.R2 AND t.R1 < t2.R1 #( beinhaltet: t.R1 != t2.R1 )
GROUP BY t.R2

(btw wenn dir Group_concat nicht gefällt, kannste den X-Join auch in
deiner Subquery probieren.)



---> Achtung alle Querys ungetestet!

Report this message

#3: Re: Optimierungsfrage

Posted on 2008-04-18 11:06:02 by Harald Fuchs

In article <66qjs9F2laphqU1@mid.individual.net>,
"Andreas Born" <Andreas.Born@gmx.de> writes:

> t: R1 R2
> 1 a
> 2 b
> 3 b
> 4 c
> 5 d
> 6 e
> 7 e
> 8 e
> 9 f

> gewünschtes Ergebnis:

> r: R1 R2 cnt
> 2 b 2
> 3 b 2
> 6 e 3
> 7 e 3
> 8 e 3

> Aktuell löse ich das mit einem join auf einen subquery:

> select t.R1,t.R2,t2.cnt
> from t left join (select
> R2, count(*) as cnt from t group by R2 having cnt > 1
> ) as t2 on t.R2 = t2.R2
> where t2.R2 is not null
> order by t2.cnt,R1,R2


> Geht das evtl. einfacher, d.h. ohne subquery?

Einfacher schon, aber wohl nicht so performant:

SELECT t1.r1, t1.r2, count (t2.r1) + 1 AS cnt
FROM t t1
JOIN t t2 ON t2.r2 = t1.r2 AND t2.r1 != t1.r1
GROUP BY t1.r1, t1.r2

Report this message

#4: Re: Optimierungsfrage

Posted on 2008-04-18 11:47:07 by Boris Stumm

Andreas Born wrote:
> Geht das evtl. einfacher, d.h. ohne subquery?

Dein Subject ist "Optimierungsfrage", was eigentlich
nicht zu dem Rest deiner Mail passt. Willst du es
einfach oder willst du es schnell? So viele sinnvolle
Möglichkeiten seh ich allerdings nicht.

select
t1.r1, t1.r2, count(*)
from
t t1, t t2
where
t1.r2 = t2.r2
group by
t1.r1, t1.r2

Report this message

#5: Re: Optimierungsfrage

Posted on 2008-04-18 11:54:22 by Thomas Rachel

Boris Stumm schrieb:

> select
> t1.r1, t1.r2, count(*)
> from
> t t1, t t2
> where
> t1.r2 = t2.r2
> group by
> t1.r1, t1.r2

Der Komma-Operator hier führt im Falle von Erweiterungen des Querys zu
unnötigem Ärgernis.

Was spricht gegen

select
t1.r1, t1.r2, count(*)
from
t t1 join t t2 using (r2)
group by
t1.r1, t1.r2

?


Thomas

Report this message

#6: Re: Optimierungsfrage

Posted on 2008-04-21 12:09:37 by Boris Stumm

Thomas Rachel wrote:

> Boris Stumm schrieb:
>> select
>> t1.r1, t1.r2, count(*)
>> from
>> t t1, t t2
>> where
>> t1.r2 = t2.r2
>> group by
>> t1.r1, t1.r2
>
> Der Komma-Operator hier führt im Falle von Erweiterungen des Querys zu
> unnötigem Ärgernis.
>
> Was spricht gegen
>
> select
> t1.r1, t1.r2, count(*)
> from
> t t1 join t t2 using (r2)
> group by
> t1.r1, t1.r2

Nix :-)
Würde ich unter "Geschmacksfrage" abhaken.

Report this message

#7: Re: Optimierungsfrage

Posted on 2008-04-23 01:47:34 by Andreas Born

Hi,

leider ist mir zeitlich etwas dazwischen gekommen und ich komme jetzt
erst zum antworten.

Zunächst einmal vielen Dank für alle Infos und Tipps. Ich werde mal
austesten welche der Abfragen am schnellste ist, habe aber den Eindruck,
daß ich schon (mehr oder weniger zufälig) das optimum getroffen habe.

Btw, mit "einfacher" implizierte ich auch eine performantere Abfrage;
daß das nicht unbedingt korrelieren muß ist mir dann auch aufgefallen,
leider zu spät ;-)

Also nochmals vielen Dank für Eure Antworten!


Viele Grüße,
Andreas

Report this message