2009-06-22 5 views
0

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) 

Antwort

1
+0

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

+0

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