Datensätze auf zwei Kriterien prüfen
Hallo,
wie bekomme ich am besten Datensätze aus einer Tabelle, welche 2 Kriterien entsprechen müssen.
Beispiel:
Tabelle Aufträge hat Felder "Ident" und "Artikel".
Darin u.a. Datensätze wie:
Ident=123456 Artikel=Hauptartikel
Ident=123456 Artikel=Nebenartikel 1
Ident=123456 Artikel=Nebenartikel 2
Die Nebenartikel sind optional.
Jetzt möchte ich nur Aufträge sehen, bei denen ein bestimmter Nebenartikel enthalten ist.
Das Problem: In den Ergebnissen muss der Hauptartikel angezeigt werden, und nur der.
Die Tabelle besitzt auf dem Feld "Ident" auch noch einen Join zu einer anderen Tabelle.
Ich habe das mit einer verschachtelten Abfrage hinbekommen, in der ich mir zunächst alle Aufträge mit dem gewünschten Nebenartikel suche,
aber das dauert bei 6 Ergebnissen schon ca. 4 Sekunden. Das liegt daran, das in der inneren Abfrage etwa 50000 Ergebnisse drin sind.
Das ist zu viel. Ich muss das irgendwie "schlanker" bekommen.
Ich kann den Auftragszeitraum begrenzen (das mache ich z.Z. in der äußeren Abfrage), jedoch liegen diese Infos (Datumsangaben) in der "gejointen" Tabelle. Ich wüßte jetzt nicht wie und ob ich in der inneren Abfrage das berücksichtigen kann.
Gruß, Andreas
wie bekomme ich am besten Datensätze aus einer Tabelle, welche 2 Kriterien entsprechen müssen.
Beispiel:
Tabelle Aufträge hat Felder "Ident" und "Artikel".
Darin u.a. Datensätze wie:
Ident=123456 Artikel=Hauptartikel
Ident=123456 Artikel=Nebenartikel 1
Ident=123456 Artikel=Nebenartikel 2
Die Nebenartikel sind optional.
Jetzt möchte ich nur Aufträge sehen, bei denen ein bestimmter Nebenartikel enthalten ist.
Das Problem: In den Ergebnissen muss der Hauptartikel angezeigt werden, und nur der.
Die Tabelle besitzt auf dem Feld "Ident" auch noch einen Join zu einer anderen Tabelle.
Ich habe das mit einer verschachtelten Abfrage hinbekommen, in der ich mir zunächst alle Aufträge mit dem gewünschten Nebenartikel suche,
aber das dauert bei 6 Ergebnissen schon ca. 4 Sekunden. Das liegt daran, das in der inneren Abfrage etwa 50000 Ergebnisse drin sind.
Das ist zu viel. Ich muss das irgendwie "schlanker" bekommen.
Ich kann den Auftragszeitraum begrenzen (das mache ich z.Z. in der äußeren Abfrage), jedoch liegen diese Infos (Datumsangaben) in der "gejointen" Tabelle. Ich wüßte jetzt nicht wie und ob ich in der inneren Abfrage das berücksichtigen kann.
Gruß, Andreas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1212611426
Url: https://administrator.de/forum/datensaetze-auf-zwei-kriterien-pruefen-1212611426.html
Ausgedruckt am: 11.04.2025 um 18:04 Uhr
10 Kommentare
Neuester Kommentar
SELECT DISTINCT a1.* FROM Aufträge a1 INNER JOIN Aufträge a2 ON a1.Ident = a2.Ident AND a1.Artikel = 'Hauptartikel' AND a2.Artikel LIKE 'Nebenartikel%'
Das mit UNION kann eigentlich nicht sinnvoll sein.
Moin,
stimme hier @ukulele-7 zu: Das Beispiel ist Mist und UNION ist noch mehr Mist
Eine andere Möglichkweit wäre_
Besser wäre es, wenn man den Hauptartikel und die Nebenartikel eindeutig spezifizieren könnte. Denn was passiert, wenn dein Nebenartikel plötzlich ein Hauptartikel wird?
Vielleicht kann man über Produktgruppen gehen!?
Gruß
em-pie
stimme hier @ukulele-7 zu: Das Beispiel ist Mist und UNION ist noch mehr Mist
Eine andere Möglichkweit wäre_
SELECT
artikel
FROM
myAuftragPos
WHERE
ident in (
SELECT ident FROM myAuftragPos WHERE artikel = 'meinwunschartikel')
AND artikel = 'Hauptartikel'
Besser wäre es, wenn man den Hauptartikel und die Nebenartikel eindeutig spezifizieren könnte. Denn was passiert, wenn dein Nebenartikel plötzlich ein Hauptartikel wird?
Vielleicht kann man über Produktgruppen gehen!?
Gruß
em-pie
Du hast grundsätzlich drei Möglichkeiten da sinnvoll ran zu gehen.
1) Du baust was mit Subselect, so wie em-pie nur eben mit den Nebenartikeln. Ich glaube das hast du schon gemacht und es dauert vermutlich länger. Den Code hast du nicht gezeigt...
2) WHERE EXISTS ( Subselect ), ähnlich lange.
3) Oder ein Join, möglichst spezifisch so wie mein Ansatz. Könnte auch sehr viele Datensätze betreffen muss man ausprobieren, aber meist ist Join am schnellsten. Du joinst die Tabelle mit sich selbst, auf der einen Seite Hauptartikel, auf der anderen Nebenartikel die deine Kriterien erfüllen. Du nimmst nur die Spalten der Hauptartikel und filterst auf Dubletten, quick and maybe a bit dirty aber sollte es tuen.
1) Du baust was mit Subselect, so wie em-pie nur eben mit den Nebenartikeln. Ich glaube das hast du schon gemacht und es dauert vermutlich länger. Den Code hast du nicht gezeigt...
2) WHERE EXISTS ( Subselect ), ähnlich lange.
3) Oder ein Join, möglichst spezifisch so wie mein Ansatz. Könnte auch sehr viele Datensätze betreffen muss man ausprobieren, aber meist ist Join am schnellsten. Du joinst die Tabelle mit sich selbst, auf der einen Seite Hauptartikel, auf der anderen Nebenartikel die deine Kriterien erfüllen. Du nimmst nur die Spalten der Hauptartikel und filterst auf Dubletten, quick and maybe a bit dirty aber sollte es tuen.
Easy, einfach noch einen weiteren Join
TOP 100 ist nicht so gut wenn kein ORDER BY, ich denke mal das ist nur zum testen. Auch * sollte sauber aufgedröselt werden wenn der Code produktiv geht.
SELECT DISTINCT a1.*,k.* FROM "Firma$Auftragsartikel" a1 INNER JOIN "Firma$Auftragsartikel" a2 ON a1."Ident" = a2."Ident" where
a1."Zeilennummer" = 10000 and a2."Artikel" LIKE '%MC.02.15%'
LEFT JOIN "Firma$Auftragskopf" k
ON a1."Ident" = k."Ident"