2009-06-22 44 views
0

我有一個需要轉換爲MySQL的SQL Server查詢。我以前從未使用SQL Server/T-SQL,所以我沒有FOR XML PATH的經驗。關於這類事情的文檔很少。如果我刪除了FOR XML PATH語句,MySQL將返回錯誤「Operand should contain at least 1 column(s)」。PHP/MySQL中的SQL Server'FOR XML PATH'

似乎嵌套的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
+0

謝謝!第三個鏈接似乎是我正在尋找的。我發現所有其他人都在四處搜尋。 (CONCAT`截斷數據的問題,然而(ala MySQL關於通過查詢生成XML的文檔)。 – sli 2009-06-22 20:49:07