Laden...

Filter SQL (TabA/TabB 1:N) (TabA Anzeigen wenn 2x N Zutrifft)

Erstellt von purestrain vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.710 Views
purestrain Themenstarter:in
89 Beiträge seit 2006
vor 17 Jahren
Filter SQL (TabA/TabB 1:N) (TabA Anzeigen wenn 2x N Zutrifft)

Hallo,

Ich habe einen kleinen Parser geschrieben, der 0815 Suchtext in SQL Statements umwandelt; Aufgrunddessen kann der Kunde sich eine schoene Suchzeile zusammenklickern.

Mein Problem ist nun folgende konstellation:

1:N Beziehung zwischen TabelleA, TabelleB.

Ich moechte jede ID von TabelleA haben, in der 2 oder mehr Werte von TabelleB vorkommen. Per SQL bekomme ich natuerlich pro Datensatz in B eine Zeile inklusive A.

Bei 2 oder mehr Werten bekomme ich so also keine Ergebnisse; Da jede Zeile fuer sich betrachtet wird.

Gibt es also in SQL eine Filtermethode, in der alle Zeilen von B als gesamtheit zu einem Eintrag in Tabelle A betrachtet werden?

Ich hoffe alles verstaendlich geschrieben zu haben 🙂

purestrain Themenstarter:in
89 Beiträge seit 2006
vor 17 Jahren

Bzw. Gibt es eine bessere moeglichkeit, als mit weiteren Subselects zu arbeiten?

O
778 Beiträge seit 2007
vor 17 Jahren

Select A.ID as ID,Count(B.ID) as Anzahl From TabelleA as A OUTER JOIN TabelleB as B On B.Ref=A.ID Where Anzahl ≥ 2;

Probier das mal und poste was passiert!

purestrain Themenstarter:in
89 Beiträge seit 2006
vor 17 Jahren

In deinem Beispiel wuerde eine Bedingung auf Tabelle B fehlen => Nicht ganz das was ich will. Im Prinzip suche ich alle Datensaetze von A, in denen 2 oder mehr Bedingungen von B (in der gleichen Spalte) auftreten.

Z.b. alle Bestellungen in denen die Artikelnummer 4711 mit Menge 1 und 4711 mit Menge 3 vorkommt.


SELECT * FROM orders WHERE id IN (SELECT OrderId FROM POS WHERE xxx) AND ID IN (SELECT OrderId FROM POS WHERE YYY)

Ich glaube, es geht nicht wirklich zu vereinfachen.

p.s.
Sorry, erste Post war nicht aussagekraeftig genug

O
778 Beiträge seit 2007
vor 17 Jahren

Was für Bedingungen sind denn xxx und yyy?

purestrain Themenstarter:in
89 Beiträge seit 2006
vor 17 Jahren

eigentlich irrelevant, aber z.B.
XXX = "Artikelnummer = "TEST" UND Menge=2"
YYY = "Artikelnummer = "TEST" UND Menge=3"

O
778 Beiträge seit 2007
vor 17 Jahren
Select Orders.* From orders as Orders Inner Join Pos as Pos On Pos.OrderID=Order.ID Where Pos.Artikelnummer=4652345 And Pos.Menge>1

Spielt nämlich doch eine Rolle. Ich hatte das Datenbankdesign anders vermutet...

purestrain Themenstarter:in
89 Beiträge seit 2006
vor 17 Jahren

Wirklich? Sollte es nicht grundlegend egal sein, auf welche Werte ich filtern moechte?
xxx = WHERE Id=4711 AND Freitext='blabla'
yyy = WHERE Id<1000 OR Preis>1000

Ich glaube, du hast nicht verstanden was ich moechte; Trotzdem Danke. Es koennten auch genausogut 25 Bedingungen sein, die zutreffen muessen, und die koennen auf jedes beliebige Feld zielen.

O
778 Beiträge seit 2007
vor 17 Jahren

Original von purestrain

  
SELECT * FROM orders WHERE id IN (SELECT OrderId FROM POS WHERE xxx) AND ID IN (SELECT OrderId FROM POS WHERE YYY)  
  

lässt sich generell vereinfachen zu

Select O.* From orders as O Inner Join Pos as P On P.OrderID=O.ID Where xxx and yyy

Das einzige, was du machen musst, ist xxx und yyy genauer ausdrücken:

XXX = "p.Artikelnummer = "TEST" UND p.Menge=2"
YYY = "p.Artikelnummer = "TEST" UND p.Menge=3"

In dem Fall kommt zwar kein Ergebnis, weil Menge nicht gleichzeitig 2 und 3 sein kann, aber egal

purestrain Themenstarter:in
89 Beiträge seit 2006
vor 17 Jahren

Kann es schon, wenn zu der Order 2 Positionen mit jeweils Menge 2 und Menge 3 existieren 🙂

purestrain Themenstarter:in
89 Beiträge seit 2006
vor 17 Jahren

Hallo,

Falls noch jemand eine Antwort bzw. einen Loesungsvorschlag kennt, so moege er bitte jetzt posten. Vielleicht gibt es da bei sql2005 eine moeglichkeit? Z.b. das eine Where abfrage auf mehrere Zeilen gleichzeitig zu einer Id filtert?

Wie gesagt:
Das Problem ist, das ich jeden Auftrag wissen moechte, in dem auf 2,3 oder [x] Positonen irgendwelche Bedingungen auftreten.

Frei nach folgendem Muster:

"Zeige mir alle AuftragsIds an, in denen das Produkt 4711 UND das Produkt 4712 vorkommt"

"Zeige mir alle AuftragsIds von [xxxx] an, in denen das Produkt 4711 mit Menge 10000 UND das Produkt 4712 vorkommt"