1

複数のテーブルのデータを1つのテーブルに保存したい

table A (
p, q,
PRIMARY KEY (p,q)
)

table B (
p, m, n,
PRIMARY KEY (p,m,n)
)

table output(
p,
xml
)

出力は次のようになります

テーブルAの場合

 -------------------------------
|    p      |        xml        |
---------------------------------
|value of p | <q>some value</q> |
 -------------------------------

テーブルBの場合

 -----------------------------------------------
|    p      |        xml                        |
------------------------------------------------
|value of p | <m>some value</m><n>some data</n> |
 -----------------------------------------------

これは、このクエリによって実現できます

SELECT * 
FROM Students s
CROSS APPLY
(
    SELECT 
        (
            SELECT * 
            FROM Students t
            WHERE t.DisplayName = s.DisplayName
            FOR XML RAW
        ) x1
)x

ただし、SQLを十分にジェネリックにして、任意のテーブル名を指定して上記の出力を取得できるようにします。

内部結合の問題は、クエリが一般的ではないことです。

4

2 に答える 2

1

1つのテーブルから必要な結果を得るには、次のようなものを使用できます。

select T.Table1ID,
       (
         select T.*
         for xml raw, type
       ) as x1
from Table1 as T

同じパターンを別のテーブルに適用するには、キー列のテーブル名とフィールド名を変更する必要があります。

select T.Table2ID,
       (
         select T.*
         for xml raw, type
       ) as x1
from Table2 as T

さらに一般的なバージョンが必要な場合は、動的SQLを使用して、テーブル名と列名からクエリを作成できます。

declare @TableName sysname 
declare @KeyColumnName sysname

set @TableName = 'master..spt_values'
set @KeyColumnName = 'Number'

declare @SQL nvarchar(500)

set @SQL = '
select '+@KeyColumnName+',
       (
         select T.*
         for xml raw, type
       ) as x1
from '+@TableName+' as T'

exec (@SQL)
于 2013-01-10T06:32:45.197 に答える
0

誤解してすみませんが、これは多かれ少なかれあなたが求めている原則ですか?

;WITH Base AS
(
    SELECT   Cat    = PC.Name
            ,SubCat = SC.Name
    FROM Production.ProductCategory     PC
    JOIN Production.ProductSubcategory  SC  ON SC.ProductCategoryID = PC.ProductCategoryID
)
SELECT Cat, (SELECT SubCat FROM Base T2 WHERE T2.Cat = T1.Cat FOR XML AUTO )DT
FROM Base T1
于 2013-01-10T06:03:14.267 に答える