SQL Server «ДЛЯ ПУТИ XML» в PHP / MySQL - PullRequest
0 голосов
/ 23 июня 2009

У меня есть запрос SQL Server, который мне нужно преобразовать в MySQL. Я никогда раньше не использовал SQL Server / T-SQL, поэтому у меня нет опыта работы с FOR XML PATH. Там удивительно мало документации по этому виду вещей. Если я удаляю оператор FOR XML PATH, MySQL возвращает ошибку "Operand should contain at least 1 column(s)."

Кажется, что вложенные операторы SELECT возвращают строки, содержащие необработанные данные XML, но у меня нет исходной базы данных SQL Server, доступной для проверки этой теории. Я мог бы легко подражать этому эффекту, если бы знал схему возврата.

Оригинальный запрос ниже:

  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'."

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

Это оригинальный запрос T-SQL (извините за все это):

        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)

1 Ответ

3 голосов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...