Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

SQL - Werte in zwei Tabellen vergleichen - Aus einer Tabelle sollen nur bestimmet Datensätze verwendet werden

Frage Entwicklung Datenbanken

Mitglied: XSD2612

XSD2612 (Level 1) - Jetzt verbinden

08.07.2010, aktualisiert 20:17 Uhr, 23133 Aufrufe, 2 Kommentare

Halllo zusammen, ich habe ein kniffliges SQL - Problem und hoffe mir kann jemand weiterhelfen

Ich habe zwei Tabellen, Tab1, Tab2, die sehen so aus:

Tab1:
Artikel_NrPreisliste_NrDatumPreis
1202010051111,20
210201005117,30
310201005115,60
320201005115,80
330201005116,20
4102010051162,30

Tab2:
Artikel_Nr Preis_KennzeichenDatumPreis
1E2010061210,60
1E2010063010,40
1E2010052011,50
1F2010061011,30
2E200912167,30
2F200908177,50
2G201001137,20
3E200906205,70
3E201004155,60
4E2009061364,20
4G2008060361,20
4G2009021665,40

Nun möchte ich die Artikel finden, die in Tab1 und Tab2 einen unterschiedlichen Preis haben, und zwar unter folgenden Bedingungen:
Nur die Artikel vergleichen, bei denen in Tab1 die Preisliste_Nr = 10 ist.
Diese sollen mit den entspechenden Artikeln in Tab2 verglichen werden, bei denen das Preis_Kennzeichen = E ist und die dort das neuese Datum haben (also wo das Datum am größten ist)

Das Ergebniss sollte so aussehen:
Artikel_Nr Preisliste_NrDatum Preis Artikel_Nr Preis_KennzeichenDatumPreis
1102010051110,3 1E2010063010,40
4102010051162,3 4E2009061364,20

Ich hab das mit folgenden Statement versucht:

select a.Artikel_Nr, a.Preisliste_Nr, a.Datum, a.Preis,
b.Artikel_Nr, b.Preis_Kennzeichen, b.Datum, b.Preis
from Tab1 a, Tab2 b
where a.Artikel_Nr = b.Artikel_Nr
and a.Preisliste_Nr = '10'
and b.Preis_Kennzeichen = 'E'
and a.Preis <> b.Preis;

Als Ergebnis bekomme ich das:
Artikel_Nr Preisliste_NrDatum Preis Artikel_Nr Preis_KennzeichenDatumPreis
1102010051110,31E2010061210,60
1102010051110,31E2010063010,40
1102010051110,31E2010052011,50
310201005115,63E200906205,70
4102010051162,34E2009061364,20

Ist ja auch klar, weil ich in Tab2 die Auswahl nicht auf die Datensätze mit dem neuesten Datum beschränkt hab (b.Datum)

Ich weis aber nicht wie ich das machen soll, ich vermute mit max(b.Datum), weil die Datumswerte so angelegt sind, das die neuesten den höchsten Wert haben. Aber ich habe keine Ahnung wie ich so ein select in das Statement mit einbauen kann

Ich hoffe von Euch kann mir jemand helfen,

Vielen Dank, Matze
Mitglied: Biber
08.07.2010 um 20:36 Uhr
Moin XSD2612,

willkommen im Forum.

Biite bei SQL-Fragen immer das Blech angeben, was drunterliegt.
Denn weniger standardisiert als "SQL" sind nur noch die Rezeptvariationen für "Birne Helene" und deutsche Steuergesetze.

Eine der vielen Möglichkeiten wäre, deine bisherige Abfrage als "innere Abfrage" as is zu erhalten und eine aggregierende Query drumherumzuwickeln.
Oder aber, die Aggregation in einer SubQuery abzufackeln.
Okay, vorher aber noch die bestehende etwas weniger redundant machen.
01.
select  a.Artikel_Nr,  a.Preisliste_Nr,  a.Datum  as Preislistendatum, a.Preis as PL_Preis, 
02.
             b.Preis_Kennzeichen, b.Datum, b.Preis 
03.
from Tab1 a, Tab2 b  
04.
where a.Artikel_Nr = b.Artikel_Nr 
05.
    and a.Preisliste_Nr = '10', 
06.
   and b.Preis_Kennzeichen = 'E' 
07.
   and a.Preis <> b.Preis;
--> Das wäre immer noch "deine" Query, nur ohne doppelte Felder (ist echt nicht nötig) und erst recht ohne doppelte Feldnamen mit unterschiedlichem Inhalt.

Wenn wir jetzt zusätzlich zu "Tab2 b" die Werte aus einer "Grouped By-Tab2" mit Alias c holen

01.
select  a.Artikel_Nr,  a.Preisliste_Nr,  a.Datum  as Preislistendatum, a.Preis as PL_Preis, 
02.
             b.Preis_Kennzeichen, b.Datum, b.Preis 
03.
from Tab1 a, Tab2 b, ( select Artikel_nr, max(Datum) as maxdatum 
04.
                                          from Tab2 
05.
                                            Where   Preis_Kennzeichen = 'E' 
06.
                          Group by Artikel_nr, Preis_Kennzeichen) c 
07.
where a.Artikel_Nr = b.Artikel_Nr 
08.
     and b.Artikel_nr = c.Artikel_nr 
09.
    and a.Preisliste_Nr = '10' 
10.
   and b.Preis_Kennzeichen = 'E'  
11.
   and a.Preis <> b.Preis 
12.
   and b.datum = c.Maxdatum 
13.
;
--> dann sollte es klappen.

Die WHERE-Klausel innerhalb der neuen virtuellen Tabelle c kann ebensogut nach unten - sonst ist das Statement nicht richtig einleuchtend.
01.
select  a.Artikel_Nr,  a.Preisliste_Nr,  a.Datum  as Preislistendatum, a.Preis as PL_Preis, 
02.
             b.Preis_Kennzeichen, b.Datum, b.Preis 
03.
from Tab1 a, Tab2 b, ( select Artikel_nr, Preis_Kennzeichen, max(Datum) as maxdatum 
04.
                            from Tab2  
05.
                          Group by Artikel_nr, Preis_Kennzeichen) c 
06.
where a.Artikel_Nr = b.Artikel_Nr 
07.
     and b.Artikel_nr = c.Artikel_nr 
08.
    and a.Preisliste_Nr = '10' 
09.
   and b.Preis_Kennzeichen = 'E'  
10.
   and b.Preis_Kennzeichen =  c.Preis_Kennzeichen 
11.
   and a.Preis <> b.Preis 
12.
   and b.datum = c.Maxdatum 
13.
;
[ungetestete Skizze]

Grüße
Biber

[Edit] Sorry, das "from Tab2" fehlte bei den beiden Group-by-Varianten unten [/Edit]
Bitte warten ..
Mitglied: XSD2612
09.07.2010 um 08:40 Uhr
Hallo Biber,

vielen Dank für deine Hilfe!!
hat wunderbar funktioniert
Das ganze war für Oracle

Viele Grüße
XSD2612
Bitte warten ..
Neuester Wissensbeitrag
Off Topic

"Ich habe nichts zu verbergen"

(2)

Erfahrungsbericht von FA-jka zum Thema Off Topic ...

Ähnliche Inhalte
Microsoft Office
Excel 2010 - Zwei Tabellen vergleichen (Zugriffsprüfung) (2)

Frage von d4shoerncheN zum Thema Microsoft Office ...

Datenbanken
gelöst SQL . 2 Felder bzw. Werte vergleichen und Rückmeldung 0 oder 1 (2)

Frage von wawidl zum Thema Datenbanken ...

Datenbanken
gelöst Access 2010 SQL Tabellen Datensätze einfügen (6)

Frage von Dr.Cornwallis zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Linux Netzwerk
gelöst DHCP vergibt keine Adressen (31)

Frage von Maik82 zum Thema Linux Netzwerk ...

Exchange Server
gelöst Bestehende eMails autoamatisch weiterleiten (22)

Frage von metal-shot zum Thema Exchange Server ...

Switche und Hubs
LAG zwischen SG300-Switches macht Probleme. Wer weiß Rat? (20)

Frage von White-Rabbit2 zum Thema Switche und Hubs ...

Apache Server
gelöst Lets Encrypt SSL mit Apache2 (20)

Frage von banane31 zum Thema Apache Server ...