Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   select auf gleiche tabelle (https://www.delphipraxis.net/187902-select-auf-gleiche-tabelle.html)

jangbu 13. Jan 2016 17:03

Datenbank: MSSQ • Version: 2008 • Zugriff über: TSQL

select auf gleiche tabelle
 
Hallo,

kann mir jemand bei einer Abfrage helfen?
Ich muss in einer HEADER-Tabelle die No ermitteln um damit in einer Detail-Tabelle die zugehörigen Daten zu finden

wenn die so in Tabelle liegen würden, wäre die Abfrage kein Problem: select * from tabelle where charge = 4711 and Datum >= '10.01.2016' and Zusatz = 'ABC'
HEADER:
NO Charge Datum Zusatz_1 Zusatz_2
123 4711 10.01.2016 ABC 123

Die HEADER-Tabelle ist aber so aufgebaut:
NO Name Wert
1234 Charge 4711
1234 Datum 10.01.2016
1234 Zusatz_1 ABC
1234 Zusatz_2 123

Charge,Datum,Zusatz existieren beliebig oft(die Charge beginnt jedes Jahr wieder bei 1) aber die Kombination der vier Felder ist eindeutig.
Ich müsste also eigentlich 4 separte selects auf das gleich Feld (Wert = '4711' / Wert = '10.01.2016' / Wert = 'ABC' / Wert = '123') machen und die Ergebnis so miteinander verbinden, das ich nur die NO zurückbekomme die bei allen 4 Abfragen gleich ist. Mit welcher Abfrage würde ich diese Schnittmenge zurückbekommen?

mkinzler 13. Jan 2016 17:23

AW: select auf gleiche tabelle
 
Verwende Aliases, dann kannst Du meherere Instanzen einer Tabelle adressieren:

SQL-Code:
select
  a.Feld,
  b.Feld
from
  Tabelle a, Tabelle b
where
   ...
Im speziellen Fall benötigst Du Pivotabfragen

http://www.codeproject.com/Tips/5008...t-In-Sql-Query

Dejan Vu 14. Jan 2016 06:32

AW: select auf gleiche tabelle
 
Das ist ein SQL-Antipattern (Entity-Attribute-Value Tabelle). Zugriff geht z.B. so
Code:
select
   (select Wert from Tabelle x where x.ID = t.ID and x.Name = 'Charge') as Charge
 , (select Wert from Tabelle x where x.ID = t.ID and x.Name = 'Datum') as Datum
 , (select Wert from Tabelle x where x.ID = t.ID and x.Name = 'Zusatz_1') as Zusatz_1 
 , (select Wert from Tabelle x where x.ID = t.ID and x.Name = 'Zusatz_2') as Zusatz_2
from Tabelle t
where t.ID = 1234
Das geht, wenn es immer nur diese 4 Namen gibt. Ansonsten muss man das mit dynamischem SQL lösen, d.h. eine Query dynamisch bauen, die alle Namen enthält. Oder mit der Pivot-Funktion im Client (Excel, Delphi o.ä.). Wenn das ein Report werden soll, kann man das sehr elegant mit Fast-Report lösen, ganz ohne Code.

jangbu 20. Jan 2016 07:14

AW: select auf gleiche tabelle
 
Danke für die Antworten. Ich habe es mit mehrfachem inner join auf die gleiche Tabelle hinbekommen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz