2014-05-08 158 views
-4

我有3个表电话簿,DynamicField,PhoneBook_DynamicField_RelT-SQL查询与枢轴

电话簿:

|---ID----|---Name----| 
    1   Reza 
    2   Ali  

DynamicField:

|---ID----|--Caption--| 
    1   Job 
    2   Level 

PhoneBook_DynamicField_Rel:

|---ID----|--PhoneBookID--|--DynamicFieldID--|---Value---| 
    1   1     1    Emp 
    2   1     2    1 
    3   2     1    SomeJob  

我想对这个结果进行查询:

|--PhoneBookID--|--Name--|--Job--|--Level--| 
     1   Reza  Emp  1 
     2   Ali SomeJob NULL 
+0

你尝试过这么远吗?不要在这里写一个问题,期待别人为你做你的工作。 – Dan

+0

我不知道如何枢轴工作,我不希望其他人为我做我的工作,只是我有问题,我认为这个网站是为它...你可以问,你不知道和回应其他人回答什么知道,并且相反,。我也想知道枢轴是如何工作的,这不是我的工作......这是我的问题 –

回答

1

也许是这样的:

测试数据:

CREATE TABLE #PhoneBook(ID INT,Name VARCHAR(100)) 
INSERT INTO #PhoneBook VALUES(1,'Reza'),(2,'Ali') 

CREATE TABLE #DynamicField(ID INT,Caption VARCHAR(100)) 
INSERT INTO #DynamicField VALUES(1,'Job'),(2,'Level') 

CREATE TABLE #PhoneBook_DynamicField_Rel(ID INT,PhoneBookID INT, 
             DynamicFieldID INT,Value VARCHAR(100)) 
INSERT INTO #PhoneBook_DynamicField_Rel 
VALUES(1,1,1,'Emp'),(2,1,2,'1'),(3,2,1,'SomeJob') 

获取colums

DECLARE @cols VARCHAR(MAX) 
SELECT @cols=STUFF 
(
    (
     SELECT 
      ',' +QUOTENAME(tbl.Caption) 
     FROM 
      #DynamicField AS tbl 
     FOR XML PATH('') 
    ) 
,1,1,'') 

那么查询就像这样:

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    * 
FROM 
(
    SELECT 
     * 
    FROM 
    (
     SELECT 
      PhoneBook.ID, 
      PhoneBook.Name, 
      field.Caption, 
      rel.Value 
     FROM 
      #PhoneBook AS PhoneBook 
      JOIN #PhoneBook_DynamicField_Rel AS rel 
       ON PhoneBook.ID = rel.PhoneBookID 
      JOIN #DynamicField AS field 
       ON rel.DynamicFieldID=field.ID 
    ) AS SourceTable 
) AS p 
PIVOT 
(
    MAX(Value) FOR Caption IN('[email protected]+') 
) AS pvt' 
EXECUTE(@query) 

然后在我的情况下,我会删除临时表:

DROP TABLE #PhoneBook 
DROP TABLE #DynamicField 
DROP TABLE #PhoneBook_DynamicField_Rel 
1

你需要的是动态的支点:

declare @collist nvarchar(max) 
SET @collist = stuff((select distinct ',' + QUOTENAME(caption) 
      FROM DynamicField 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

declare @q nvarchar(max) 
set @q = ' 
select PhoneBookID, Name, ' + @collist + ' 
from (
    select PhoneBookID, Name, Caption, Value 
     from (
     select PhoneBookID, Name, Caption, Value 
     from PhoneBook pb 
     inner join PhoneBook_DynamicField_Rel pbdf on pb.ID = pbdf.PhoneBookID 
     inner join DynamicField df on df.ID = pbdf.DynamicFieldID 
    ) as x 
) as source 
pivot (
    max(Value) 
    for caption in (' + @collist + ') 
) as pvt 
' 

exec (@q)