neue Thread mit alter Frage: Subselect

21/02/2011 - 15:13 von Nicole Wagner | Report spam
Hallo Leute,


danke fuer alle Antworten.
Vielleicht ist die Frage doch komplexer, als ich gehofft hatte:
Ich sehe mich mit den erhaltenen Antworten nicht heraus und kann weder
herauslesen, wo ich nachschlagen koennte, noch, wie die Loesung lautet.
Ich formuliere die Frage vielleicht neu.

@Thomas: Dein Beispiel kann ich nicht analog anwenden, weil ich nicht
mal von der Syntax hinkomme. Ohne Alias und ohne Limit kann es nicht
mehr gehen oder?

Vielleicht liegt die Sache auch mit dem join komplexer?



Hier noch mal meine Query auf das Notwendige reduziert.
Primaerschluessel hatte ich keinen abgefragt. Brauche ich denn den
unbedingt?

Ich schreibe die Abfrage fuer den PK in Kommentar dazu:

select tbkurszeilen.fk_kontrakt as fk_kontrakt,
/* der Primàschlüssel lautete: id_kurszeilen, */
tbkontrakte.comm as comm,
tbkurszeilen.fk_jdatum as datum,
tbkurszeilen.openinterest as openinterest,
from tbkurszeilen /* hier kann ich kein Alias einfügen ! */
join
tbkontrakte on tbkurszeilen.fk_kontrakt = tbkontrakte.id_kontrakt
and tbkurszeilen.fk_jdatum = '15.9.2009' ;

SUBSELECT SOLL SEIN:
von dieser Abfrage will ich die ERSTEN drei Werte JEWEILS zu den
verschiedenen Comm-Treffern haben. Hierbei brauche ich also open
interest von der ersten Tabelle (JE drei Treffer) und Comm (zu ALLEN
Comm) von der join-Tabelle.

@Joe: wie ich das mit First und Skip loesen kann, weiss ich nicht. Denn
ich will ja nicht die ersten 3 Treffer insgesamt haben, sondern JEWEILS
zu JEDER Comm. Alle meine Versuche mit First haben leider nur INSGESAMT
drei Datensaetze ausgegeben.


=
hier ist noch ein stark verkürztes Beispiel (ohne join!), bei dem
zweifach der Wurm drinnen ist:
1) Es rechnet mit dem Sub-Select minutenlang. Warum nur?
2) Es gib nur INSGESAMT 3 Ergebnisse statt 3 pro Comm:

Select tbkontrakte.name_,
tbkontrakte.id_kontrakt as id
from tbkontrakte
where tbkontrakte.id_kontrakt in
(select first 3 tbkontrakte.id_kontrakt from tbkontrakte where
comm=tbkontrakte.comm order by name_ desc)

gibt:

NAME_ ID
YUZ9 7.786
YUZ9 7.826
YUZ9 8.062


Nicole
 

Lesen sie die antworten

#1 Rene Kadner
28/02/2011 - 12:57 | Warnen spam
1) Es rechnet mit dem Sub-Select minutenlang. Warum nur?
2) Es gib nur INSGESAMT 3 Ergebnisse statt 3 pro Comm:

Select tbkontrakte.name_,
tbkontrakte.id_kontrakt as id
from tbkontrakte
where tbkontrakte.id_kontrakt in
(select first 3 tbkontrakte.id_kontrakt from tbkontrakte where
comm=tbkontrakte.comm order by name_ desc)



weil das "order by" dann doch alle Daten lesen muss um sie im Anschluss zu
sortieren - und das ist teuer. Das davon dann nur die ersten drei Zeilen
verwendet werden, ist hier egal. Durch Setzen eines Index auf name_ und
evtl. comm könnte man das aber beschleunigen.

Falls das nicht geht oder doch nichts bringt und die Daten sich nicht im
Minutentakt àndern und auch so verfügbar sein müssen, lohnt es sich
eventuell dafür eine eigene (Staging-)Tabelle zu erstellen und diese per
gespeicherte Prozedur und Scheduler alle paar Stunden neu zu generieren. Das
kann dann ruhig mal paar Minuten dauern, dafür sind die Abfragen danach aber
flott. Da die Erstellung auf dem Server làuft, gibt es kein Timeout.

Ich arbeite mit einigen solchen Tabellen. Sie werden einmal nachts erstellt
(dauert so 15-20 Minuten!) und alle wissen, dass sie Daten maximal vom
Vortag haben. Im genannten Beispiel reicht das zu 98%. Die restlichen 2%
sind dann "Handarbeit" als Liveabfrage über das Management Studio, da alle
anderen Clients in das Timeout laufen.

Grüße - René

Ähnliche fragen