Ich habe eine SQL Server-Abfrage, die ich in MySQL konvertieren muss. Ich habe noch nie SQL Server/T-SQL verwendet, daher habe ich keine Erfahrung mit FOR XML PATH
. Über diese Art von Dingen gibt es erstaunlich wenig Dokumentation. Wenn ich die FOR XML PATH
-Anweisung entferne, gibt MySQL den Fehler "Operand should contain at least 1 column(s)
" zurück.SQL Server "für XML-Pfad" in PHP/MySQL
Es scheint so, als ob die verschachtelten SELECT
-Anweisungen Zeichenfolgen mit XML-Rohdaten zurückgeben, aber ich habe die ursprüngliche SQL Server-Datenbank nicht verfügbar, um diese Theorie zu testen. Ich könnte diesen Effekt leicht emulieren, wenn ich das Rückkehrschema kenne.
Die ursprüngliche Anfrage unter:
SELECT
har_autos.*, har_automodels.Model, har_automodels.MakeID, har_automakes.Make, har_autotypes.AutoType,
(SELECT har_notes.*, har_notelinks.Value
FROM har_notes
JOIN har_notelinks on (har_notes.ID = har_notelinks.NoteID)
WHERE har_autos.ID = har_notelinks.AutoID AND har_notes.NoteTypeID = 1)
AS 'UserNotes',
(SELECT har_notes.*, har_notelinks.Value
FROM har_notes
JOIN har_notelinks on (har_notes.ID = har_notelinks.NoteID)
WHERE har_autos.ID = har_notelinks.AutoID AND har_notes.NoteTypeID = 2)
AS 'EngineeringNotes'
FROM har_autos
LEFT JOIN har_automodels ON (har_autos.ModelID = har_automodels.ID)
LEFT JOIN har_automakes ON (har_automodels.MakeID = har_automakes.ID)
LEFT JOIN har_autotypes ON (har_autos.AutoTypeID = har_autotypes.ID)
UPDATE: "Not unique table/alias: 'har_automakes'
"
ich die Abfrage in seiner Gesamtheit wieder aufgebaut und es gibt jetzt
SELECT
har_autos.*,
har_automodels.Model,
har_automodels.MakeID,
har_automakes.Make,
har_autotypes.AutoType,
(SELECT
har_notes.ID,
har_notes.NoteTypeID,
har_notes.Text001,
har_notelinks.Value,
har_notelinks.AutoID,
har_autos.ID
FROM
har_notes
INNER JOIN har_notelinks ON (har_notes.ID = har_notelinks.NoteID),
har_autos
WHERE har_autos.ID = har_notelinks.AutoID AND har_notes.NoteTypeID = 1)
AS UserNotes,
(SELECT
har_notes.ID,
har_notes.NoteTypeID,
har_notes.Text001,
har_notelinks.Value,
har_notelinks.AutoID,
har_autos.ID
FROM
har_notes
INNER JOIN har_notelinks ON (har_notes.ID = har_notelinks.NoteID), har_autos
WHERE har_autos.ID = har_notelinks.AutoID AND har_notes.NoteTypeID = 2)
AS EngineeringNotes
FROM
har_autos
LEFT OUTER JOIN har_automodels ON (har_autos.ModelID = har_automodels.ID)
LEFT OUTER JOIN har_autotypes ON (har_autos.AutoTypeID = har_autotypes.ID),
har_automakes
LEFT OUTER JOIN har_automakes ON (har_automakes.MakeID = har_automakes.ID)
WHERE
ID = 1
Dies ist die ursprüngliche T-SQL-Abfrage (wirklich traurig über alle diese):
SELECT a.*, mo.Model, mo.MakeID, ma.Make, at.AutoType,
(SELECT n.*, nl.Value
FROM dbo.Notes n
JOIN dbo.NoteLinks nl on (n.ID = nl.NoteID)
WHERE a.ID = nl.AutoID AND n.NoteTypeID = 1
FOR XML PATH('Note'), TYPE
) AS 'UserNotes',
(SELECT n.*, nl.Value
FROM dbo.Notes n
JOIN dbo.NoteLinks nl on (n.ID = nl.NoteID)
WHERE a.ID = nl.AutoID AND n.NoteTypeID = 2
FOR XML PATH('Note'), TYPE
) AS 'EngineeringNotes'
FROM dbo.Autos a
LEFT JOIN dbo.AutoModels mo ON (a.ModelID = mo.ID)
LEFT JOIN dbo.AutoMakes ma ON (mo.MakeID = ma.ID)
LEFT JOIN dbo.AutoTypes at ON (a.AutoTypeID = at.ID)
Vielen Dank! Dieser dritte Link scheint genau das zu sein, wonach ich suche. Ich fand alle anderen aus der Suche. Ich hatte ein Problem mit 'CONCAT', das Daten abschneidet (ala MySQLs Dokumentation zum Erzeugen von XML via Query). – sli
Ich habe die Abfrage hinzugefügt, die mit dem Abfrage-Generator von SQL Studio erstellt wurde, und die ursprüngliche T-SQL-Abfrage, die ich portieren muss. – sli