Top-Themen

Aktuelle Themen (A bis Z)

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 per Unterabfrage mehrer Spalten holen

Mitglied: Budda

Budda (Level 1) - Jetzt verbinden

01.07.2009, aktualisiert 14:45 Uhr, 12067 Aufrufe, 12 Kommentare

Hallo,

das Problem ist etwas schwer zu beschreiben. Ich habe eine vorgegebene Datenbank mit mehreren Tabellen die Informationen zu Belegen enthalten.
Nun möchten wir ein View was uns alle möglichen Daten bereitstellt um diese auswerten zu können.

Es gibt eine Tabelle Kopf und eine Zeile. Diese beiden haben wir über deren ID mit einem innerjoin verbunden. Soweit so gut. Nun kommt das Problem.
Es gibt in diesen beiden Tabellen nun diverse Spalten mit ID's für Datensätze in anderen Tabellen. Zum Beispiel eine KundenID. Anhand dieser ID kann man dann in der Kunden Tabelle den Kunden nachschlagen.
Diese ID möchten wir in unserer Abfrage durch Firmenname, Strasse, PLZ und Ort ersetzen.

Dieses Prinzip gibt es dann noch ein paar mal mit anderen ID's auf andere Tabellen. Aber immer das selbe Prinzip.

Nun haben wir das bisher so gelöst:

Select *,
(Select Firmenname from Kunden where ID = Kopf.KundenID) AS Firmenname,
(Select Strasse from Kunden where ID = Kopf.KundenID) AS Strasse
From Kopf Inner Join Zeile On Kopf.ID = Zeile.ID

Das ganze haben wir dann für jede Spalte realisiert die wir Anhand der ID noch benötigen. Sprich die Abfrage ist mittlerweile verdammt groß und kann jetzt nicht mehr gespeichert werden, da die maximalen Tabellennamen die in einem View verwendet werden dürfen erreicht ist. Zudem ist die Abfrage natürlich auch nicht gerade performance Optimiert.

Vielleicht hat ja jemand einen Tipp für mich wie man das besser und Performanceorientierter lösen kann. Da ich mal davon ausgehe das unsere Lösung nicht gerade das gelbe vom Ei ist

Gruß
Budda
Mitglied: 14695
01.07.2009 um 15:45 Uhr
Hi,

was ist denn das Ziel? Eine Tabelle (/Sicht) mit 5000 Spalten?

Ich würde darüber nachdenken, ob ihr nicht mit mehreren Sichten (auch übersichtlicher) klar kommt. Dass die maximale Anzahl verwendbarer Tabellen erreicht ist, spricht eindeutig GEGEN euer "Design".

Grüße

OLI
Bitte warten ..
Mitglied: SlainteMhath
01.07.2009 um 15:54 Uhr
Hi,

Hm, auf die Gefahr hin jetzt total daneben zu liegen - is immerhin schon kurz vor Feierabend

Löst das hier nicht Dein Problem?
01.
Select Kopf.*, Kunden.* 
02.
From Kopf 
03.
  Inner Join Zeile On Kopf.ID = Zeile.ID 
04.
  Inner Join Kunden On Kopf.ID = Kunden.KundenID
lg,
Slainte

EDIT: Tippfehler
Bitte warten ..
Mitglied: Budda
01.07.2009 um 15:55 Uhr
Hallo Oli,

das Ziel ist es unseren Leuten im Verkauf eine Sicht für Excel zugeben übder die sie dann Ihre Kunden auswerten können.
Hierfür ist es leider erforderlich das alle Informationen zusammen sind.

Würde es performancemäßig was bringen mehrere Views zu machen und diese dann zum Schluss in einem View wieder zusammen zu fassen?

Ansonsten hab ich leider keine Idee wie wir das sonst lösen sollen.

Gruß
Budda
Bitte warten ..
Mitglied: Budda
01.07.2009 um 16:07 Uhr
Hi,

ist das nicht so, wenn ich das mit den Join mache und die Spalte mit der ID leer ist das dann der komplette Datensatz nicht zurückgegeben wird?
Das Darf nicht sein. Es kann bei jeglichen Spalten mit ID's vorkommen das dort keine enthalten ist.

Gruß
Budda
Bitte warten ..
Mitglied: SlainteMhath
01.07.2009 um 16:09 Uhr
Kommt auf den Join an

hier sind die verschiedenen Arten von JOINs gut erklärt: : http://aktuell.de.selfhtml.org/artikel/datenbanken/joins/
Bitte warten ..
Mitglied: 14695
01.07.2009 um 16:14 Uhr
Hi Budda,

so etwas in der Art (einzelne Views zusammenfassen) dachte ich. Ob du damit auch die Performance positiv beeinflussten kannst, keine Ahnung bei großen Datenbeständen -> ausprobieren.

Darüber hinaus: wenn z.B. die Kundenadressen nicht unbedingt in seperaten Spalten vorliegen müssen könntest du auch darüber nachdenken die Spalten zusammen zu fassen (SELECT LastName + ', ' + Firstname AS Name FROM Customers)... Das macht es ggf. übersichtlicher.



Grüße
Oli
Bitte warten ..
Mitglied: 14695
01.07.2009 um 16:17 Uhr
Kann vorkommen, ist so. Unter SQL Server teste ich mit ISNULL(ID, '') ob ein Wert vorhanden ist oder die Spalte NULL ist. Wenn eine ID eingetragen ist wird die ID, sonst einfach ein leerer String zurück gegeben.

Grüße
OLI
Bitte warten ..
Mitglied: Budda
01.07.2009 um 16:23 Uhr
Hm ok, wenn ich mit nen Left join in die Kunden Tabelle gehe klappt das offensichtlich soweit.
Jetzt ist es aber so das ich 5 Spalten mit ID's habe die alle auf die Kunden Tabelle gehen.
Mache ich dann für jede Spalte einen eigenen Join?

Also so:

select Kopf.*, Kunden.*
From Kopf
Inner Join Zeile On Kopf.ID = Zeile.ID
Left Join Kunden On Kopf.ID = Kunden.KundenID
Left Join Kunden On Kopf.ID2 = Kunden.KundenID
Left Join Kunden On Kopf.ID3 = Kunden.KundenID

usw.
Bitte warten ..
Mitglied: Biber
01.07.2009 um 17:21 Uhr
Moin Budda,

in Prinzip jein.
Richtig ist: Du brauchst für jeden LEFT JOIN (auch wenn er immer wieder auf die KUNDEN-Tabelle geht, jeweis eine eigene JOIN-"Zeile" bei der View-Deklaration.

Falsch ist: in jedm LEFT JOIN muss die KUNDEN-Tablle auch unter einem anderen ALIAS angesprochen werden.
Sonst dreht Deine "vorgegebene Datenbank" (hat die auch einen Spitznamen? Sowas wie mySQL oder Oracle oder TeraData?) am Rad.

Noch falscher ist: einen VIEW, eine "Sicht" anzulegen, um alle KOPF-Felder und alle KUNDEN-Felder blind anzuzeigen, so wie deren physischen Namen nun mal sein mögen und unabhängig davon, ob es interne, externe, technische oder informationstransportierende sind.

Hast Du Dich mal versucht, mit dem Thema VIEWs auseinanderzusetzen und wenn ja, was ist dazwischengekommen?

Beispielskizze, soweit sich etwas OHNE Kenntnis des DB-Blechs und ohne Kenntnis des Datenmodells/der Relationen erraten lässt:

01.
CREATE View ExcelExport (ZeilenInfo, Auftrag, AuftrDatum, Kunde, KundenAddr,  
02.
                        Lieferant, LieferantenAdr, Lieferdatum, RechDatum, RechEingang) as 
03.
select Z.zeilenInfo, K.ID , K.AufDatum,  
04.
Ku1.Name , 
05.
Ku1.Land || "-" || Ku1.PLZ || " "|| Ku1.Ort || ", " || Ku1.Str , 
06.
Ku2.Name , 
07.
Ku2.Land || "-" || Ku2.PLZ || " " || Ku2.Ort || ", "|| Ku2.Str , 
08.
K.LiefDatum, 
09.
K.RechDatum, 
10.
K.RechEingang 
11.
FROM  Kopf K  Inner Join Zeile Z  On K.ID = Z.ID  
12.
Left Join Kunden k1 On K.ID = K1.KundenID 
13.
Left Join Kunden K2 On K.ID2 = K2.KundenID 
14.
Order by kopf.id, zeile.pos.....
Bitte mehr Details...

Grüße
Biber
Bitte warten ..
Mitglied: Budda
02.07.2009 um 08:18 Uhr
Moin Biber,

danke schonmal für deinen ausführlichen Beitrag. Ich werde das gleich direkt mal antesten.

Habe allerdings noch eine Frage zu dieser Zeile:
Ku1.Land || "-" || "Ku1.PLZ" & " " Ku1.Ort || ", " Ku1.Str ,

Was genau bewirkt diese? Fasst sie die SPalten Zusammen zu einer?

Wir sprechen hier von einem SQL Server 2005. Ich hatte es gestern bereits ohne Aliase probiert, das ist mal voll in die Hose gegangen

Wir benutzen Views um die Daten in Excel Auswerten zu können.
Excel selber kann ja nur mit Views, Tabellen und Cubes arbeiten soweit ich weiss.
Tabellen ist in diesem Fall leider nich benutzbar, weil die User nicht über ausreichende Kenntnisse verfügen um sich dann Ihre Auswertungen zu erstellen.
Cubes haben wir hier keine eingerichtet und leider auch derzeit keine wirklichen Kenntnisse. Auch wenn es vermutlich die beste Variante wäre.

Gruß
Budda
Bitte warten ..
Mitglied: Biber
02.07.2009 um 08:36 Uhr
Moin Budda,

wie gestern geschrieben... ist nur eine grobe (und natürlich ungetestete) Skizze.

Ich habe eben gerade bei der Zeile, die Du zitiert hast, auch gleich irgendwelche Tippfehler bemerkt und (hoffentlich) oben im Code berichtigt.
---> Kann natürlich trotzdem sein, dass diese Skizze nicht nach einfachem Copy&Paste produktiv gesetzt werden kann...

zu Deiner Frage:
Habe allerdings noch eine Frage zu dieser Zeile:
Ku1.Land || "-" || "Ku1.PLZ" & " " Ku1.Ort || ", " Ku1.Str ,

Ja, ich habe in dem View ja unter anderem als nach außen/nach Excel sichtbare Felder definiert:
CREATE View ExcelExport (ZeilenInfo, Auftrag, AuftrDatum, Kunde, KundenAddr,
Lieferant, LieferantenAdr,
Lieferdatum, RechDatum, RechEingang) as ...

Die beiden fett angezeigten Felder füllt der View mit
select Z.zeilenInfo, K.ID , K.AufDatum,
Ku1.Name ,
Ku1.Land || "-" || Ku1.PLZ || " "|| Ku1.Ort || ", " || Ku1.Str ,


.. oder auf deutscher: "KundenAddr" wird gefüllt mit Feld "Land" plus "-" plus "PLZ" plus Leerzeichen plus "Ort"...
---> also Ergebnis ungefähr "D-12345 Whereever, Sackgasse 7" wird in View-Spalte "KundenAddr" angezeigt.

!! Bitte nicht buchstabengetreu übernehmen, sondern nur sinngemäß. !! (Ist schnell hingepfuscht worden gestern)

Grüße
Biber
Bitte warten ..
Mitglied: Budda
02.07.2009 um 09:09 Uhr
Ah alles klar.
Wunderbar, dann versuch ich das gleich mal umzusetzen.

Das man es vielleicht nicht per Copy&Paste übernehmen kann macht nix. Will ja auch verstehen was ich da mache. Daher schon ganz gut das ich das selber nochmal umsetzen muß

Gruß
Budda
Bitte warten ..
Ähnliche Inhalte
Datenbanken

SQL - Abfrage - Mehrere JOINS - Zusätzliche unterabfrage mit Group By

gelöst Frage von Andy1987Datenbanken4 Kommentare

Hallo Leute, ich habe mal wieder ein Problem mit einer SQL Abfrage. Es geht hierbei um Übersicht zur Netzwerkdokumentation, ...

Datenbanken

SQL: Inhalte aus einer Spalte mit den Inhalten aus mehreren Spalten einer zweiten Tabelle vergleichen

gelöst Frage von sqlbeginnerDatenbanken4 Kommentare

Guten Tag ich habe folgende Fragen Frage 1: Tabelle1 , Spalte A in dieser stehen Kürzel Tabelle2, Spalte A, ...

Datenbanken

SQL 2008R2: Bestimmte Spalte mehrerer Zeilen verketten

Frage von archivarioDatenbanken14 Kommentare

Hallo zusammen, nachdem ich jetzt schon Stunden verbracht habe um eine Lösung zu finden, hoffe ich auf ein erhellendes ...

PHP

Werte in einer sql Spalte addieren

gelöst Frage von helmuthelmut2000PHP13 Kommentare

Hallo, Ich habe folgendes Problem. Ich habe eine PHP Seite mit einer MSSQL Datenbank. Da gibt es eine Tabelle ...

Neue Wissensbeiträge
Router & Routing

Olle Fritzbox 7270 mit VPN und SIP-Telefonie hinter O2 Homebox 6641 als "Modem"

Erfahrungsbericht von the-buccaneer vor 2 StundenRouter & Routing

Nun war es soweit: Auch O2 hat mich mit VOIP zwangsbeglückt. Heute am Privatanschluss, in 2 Wochen ist das ...

Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 15 StundenSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 21 StundenWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Microsoft Office

MS Office 2019 ohne OneNote - OneNote App speichert nur in Cloud

Information von Deepsys vor 1 TagMicrosoft Office5 Kommentare

Microsoft zeigt deutlich wohin alles bei Ihnen geht, OneNote 2019 wird es nicht mehr geben, und die Windows 10 ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
Server SSD: NVMe PCIe 3.0 RAID?
Frage von bouneeFestplatten, SSD, Raid15 Kommentare

Hallo liebe Admins, mir stellt sich gerade die Frage, ob ein neuer Server mit SSD NVMe PCIe 3.0 Sinn ...

Sonstige Systeme
Wie Normenkataloge im Unternehmen bereit stellen?
Frage von MuzzepuckelSonstige Systeme14 Kommentare

Hallo Kollegen, ich lese schon lange hier mit, nun mein ersrer Beitrag, bzw. Frage. :-) Wir benötigen für unsere ...

Windows 10
Windows 10 Startmenü-Einstellungen Systemweit festlegen
Frage von flotautWindows 1013 Kommentare

Guten Morgen liebe Admins, wir möchten bei uns am Lehrstuhl demnächst auf Windows 10 umsteigen. Wir installieren unsere PC's ...

LAN, WAN, Wireless
OpenVPN Client Fehlermeldungen
Frage von chris84LAN, WAN, Wireless12 Kommentare

Hallo Zusammen, wir nutzen seit kurzem einen neuen Router und den OpenVPN Client. Die VPN Verbindung klappt; allerdings kommen ...