Benutzer mit den meisten Antworten
Abfrage ergibt null

Frage
-
Hallo,
ich nutze folgende Abfrage zur Erstellung einer XML Ausgabe.
select cms_layouts.*, cms_containers.* from cms_layouts,cms_containers where cms_layouts.LayoutID=cms_containers.LayoutID and cms_layouts.LayoutID=36 order by cms_containers.ContainerOrder for xml auto, ELEMENTS,TYPE, ROOT ('Layout')
Die Werte frage ich aus 2 Tabellen ab - cms_layouts und cms_containers. In der Tabelle cms_containers können 0 bis mehrere Datensätze mit der LayoutID existieren, welche dem Layout aus Tabelle cms_layouts zugeordnet ist.
Sobald in der Tabelle cms_containers kein Datensatz existiert zum jeweiligen Layout, erhalte ich null. Ich möchte jedoch auch in diesem Fall zumindest die Daten aus dem Datensatz aus der Tabelle cms_layouts.
Wie kann ich das lösen?
Gruß
Reiner
Antworten
-
Hallo Reiner,
Du verwendest hier ein impliziert formuliertes INNER JOIN; da ist das halt so, das Du kein Ergebnis erhälst, wenn es keine korresponideren Daten gibt.
Ändere es in ein OUTER JOIN um:
select cms_layouts.*, cms_containers.* from cms_layouts LEFT JOIN cms_containers ON cms_layouts.LayoutID = cms_containers.LayoutID WHERE cms_layouts.LayoutID=36 order by cms_containers.ContainerOrder for xml auto, ELEMENTS,TYPE, ROOT ('Layout')
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. April 2012 10:55
-
Hallo Rainer,
arbeite mit JOIN, dann kommst Du in der Regel besser weg :) In deinem Fall wäre das ein LEFT JOIN.
SELECT cl.*, cc.* FROM cms_layouts cl LEFT JOIN cms_containers cc ON cl.LayoutID = cc.LayoutID WHERE cl.LayoutID = 36 ORDER BY cc.ContainerOrder FOR XML AUTO, ELEMENTS, TYPE, ROOT ('Layout')
Ggfs. ist da noch ein kleiner Fehler drin, vom Grund her sollte es aber passen.
BTW: Ich hasse den Editor bzw. dessen "Codeeinfügeteil". Es kann doch echt nicht so schwer sein, da dieselbe Schriftart zu nehmen wie im Dialog, mit dem man den Code einfügen soll.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 17. April 2012 09:31
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. April 2012 10:55
Alle Antworten
-
Hallo Reiner,
Du verwendest hier ein impliziert formuliertes INNER JOIN; da ist das halt so, das Du kein Ergebnis erhälst, wenn es keine korresponideren Daten gibt.
Ändere es in ein OUTER JOIN um:
select cms_layouts.*, cms_containers.* from cms_layouts LEFT JOIN cms_containers ON cms_layouts.LayoutID = cms_containers.LayoutID WHERE cms_layouts.LayoutID=36 order by cms_containers.ContainerOrder for xml auto, ELEMENTS,TYPE, ROOT ('Layout')
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. April 2012 10:55
-
Hallo Rainer,
arbeite mit JOIN, dann kommst Du in der Regel besser weg :) In deinem Fall wäre das ein LEFT JOIN.
SELECT cl.*, cc.* FROM cms_layouts cl LEFT JOIN cms_containers cc ON cl.LayoutID = cc.LayoutID WHERE cl.LayoutID = 36 ORDER BY cc.ContainerOrder FOR XML AUTO, ELEMENTS, TYPE, ROOT ('Layout')
Ggfs. ist da noch ein kleiner Fehler drin, vom Grund her sollte es aber passen.
BTW: Ich hasse den Editor bzw. dessen "Codeeinfügeteil". Es kann doch echt nicht so schwer sein, da dieselbe Schriftart zu nehmen wie im Dialog, mit dem man den Code einfügen soll.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 17. April 2012 09:31
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. April 2012 10:55
-
Hallo Rebelhig,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.