![]() |
Datenbank: MSSQL • Version: 2005 • Zugriff über: irrellevelle
SQL-Abfrage optimieren
Hallo!
Ich kenne mich mit SQL noch nicht sonderlich gut aus, deshalb würde ich gern wissen, ob man das kleine Abfragemonster performanter hinbekommt.
SQL-Code:
Mit dieser Abfrage erreiche ich, dass nur die Adressen angezeigt werden, die in bestimmten Gruppen sind.
SELECT *
FROM ADRESSEN WHERE ADRESSEN.IDNR IN ( SELECT DISTINCT IDNR FROM ADRESSEN INNER JOIN ADRESSGRU ON (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND (GR_ID=5 OR GR_ID=39 /* OR [...] (wird dynamisch hinzugefügt) */) ) ORDER BY NAME1 ASC Die Abfrage klappt so auch, allerdings dauert sie schon ein paar Millisekündchen. Hat jemand eine bessere Idee? LG, Xong PS: Das funktioniert nicht, da DISTINCT ja nicht auf Textfelder angewandt werden darf:
SQL-Code:
SELECT DISTINCT *
FROM ADRESSEN INNER JOIN ADRESSGRU ON (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND (GR_ID=5 OR GR_ID=39 /* OR [...] */) ORDER BY NAME1 ASC |
Re: SQL-Abfrage optimieren
SQL-Code:
Warum DISTINCT?
AND (GR_ID in(5, 39, ...)
|
Re: SQL-Abfrage optimieren
Zitat:
|
Re: SQL-Abfrage optimieren
Hi,
hier könnte sicher ein Group-By helfen...
SQL-Code:
SELECT *
FROM ADRESSEN WHERE ADRESSEN.IDNR IN ( SELECT IDNR FROM ADRESSEN INNER JOIN ADRESSGRU ON (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND (GR_ID=5 OR GR_ID=39 /* OR [...] (wird dynamisch hinzugefügt) */) group by IDNR ) ORDER BY NAME1 ASC |
Re: SQL-Abfrage optimieren
Vielleicht bin ich zu blöd, aber wieso nicht einfach so:
SQL-Code:
Und statt eine ellenlange 'OR'-Kette zu basteln, baust du dir die Komma-Liste.
Select *
from Adressen where ADRESSEN.IDNR in ( select distinct adrID from ADRESSGRU where GR_ID in (39,45,12,3,4,5) ) PS: Group By sollte langsam sein, oder? |
Re: SQL-Abfrage optimieren
Zitat:
SQL-Code:
weg - das wäre für mich der erste Optinierungsschritt.
SELECT *
|
Re: SQL-Abfrage optimieren
Zitat:
Ich hab drei unterschiedliche Möglichkeiten für Abfragen erstellt:
SQL-Code:
SELECT *
FROM ADRESSEN WHERE ADRESSEN.IDNR IN ( SELECT DISTINCT IDNR FROM ADRESSEN INNER JOIN ADRESSGRU ON (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND GR_ID in (2,3 /* [...] */) ) ORDER BY NAME1 ASC
SQL-Code:
SELECT *
FROM ADRESSEN WHERE ADRESSEN.IDNR IN ( SELECT IDNR FROM ADRESSEN INNER JOIN ADRESSGRU ON (ADRESSEN.IDNR = ADRESSGRU.ADR_ID) AND GR_ID in (2,3 /* [...] */) GROUP BY IDNR ) ORDER BY NAME1 ASC
SQL-Code:
Diese Abfrage ist nach einem simplen Test am performantesten. Spricht etwas dagegen, mit der Unterabfrage zu arbeiten?
SELECT *
FROM ADRESSEN WHERE IDNR in ( SELECT ADR_ID FROM ADRESSGRU WHERE GR_ID in (2,3 /* [...] */) ) ORDER BY NAME1 ASC Kann man das noch weiter optimieren? (Sieht fast so aus wie die von alzaimar, dessen Abfrage ähnlich schnell ist.) LG, Xong |
Re: SQL-Abfrage optimieren
Zitat:
|
Re: SQL-Abfrage optimieren
Zitat:
Danke an euch alle. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz