C# 使用;“支点”;在SQL中

C# 使用;“支点”;在SQL中,c#,sql,sql-server,C#,Sql,Sql Server,不久前我提出了这个问题 基本上,回答的人很好地解释了我需要做什么。然而,我遇到了一个问题 aID| status | group | ----------------------- 1 | acti | group1 | 2 | inac | group2 | A3 | acti | group1 | 第二张桌子:这张桌子是固定的。它有大约20个值,ID都是数字 atID| traitname | ------------------ 1 | trait

不久前我提出了这个问题

基本上,回答的人很好地解释了我需要做什么。然而,我遇到了一个问题

aID| status | group   |
-----------------------
1  |   acti |  group1 |
2  |   inac |  group2 |
A3  |   acti |  group1 |
第二张桌子:这张桌子是固定的。它有大约20个值,ID都是数字

atID| traitname  |
------------------
 1  |   trait1   |
 2  |   trait2   |
 3  |   trait3   |
第三个表:该表用于识别第一个表中的资产所具有的特征。与上表中的字段同名的字段显然是链接的

tID|   aID  |   atID |   trait   |
----------------------------------
1  |   1    |    1   |   NAME    |
2  |   1    |    2   |   INFO    |
3  |   2    |    3   |   GOES    |
4  |   2    |    1   |   HERE    |
现在,用户希望程序以以下格式输出数据:

aID| status | group  | trait1 | trait2 | trait 3
-------------------------------------------------
1  |  acti  |  group1 |  NAME |  INFO  | NULL
2  |  inac  |  group2 |  HERE |  NULL  | GOES
A3 |  acti  |  group1 |  NULL |  NULL  | NULL
现在,这里的问题是,正如你所看到的,A3没有特征。在最后一个视图中,我希望A3在traits中显示为完全空。但它根本没有出现,即使它在那里。有人知道我该怎么解决这个问题吗

以下是我正在使用的查询:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(traitname) 
                    from Table2
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT aid, status, [group],' + @cols + ' 
            from 
            (
              select t1.aid,
                t1.status,
                t1.[group],
                t2.traitname,
                t3.trait
              from table1 t1
              inner join table3 t3
                on t1.aid = t3.aid
              inner join table2 t2
                on t3.atid = t2.atid
            ) x
            pivot 
            (
                max(trait)
                for traitname in (' + @cols + ')
            ) p '

execute sp_executesql @query;

问题是您正在表上使用
内部联接。
内部联接
返回两个表中具有匹配数据的所有行

由于您希望返回表1中的所有内容,因此您将更改查询以使用
左联接,而不是
内部联接

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(traitname) 
                    from Table2
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT aid, status, [group],' + @cols + ' 
            from 
            (
              select t1.aid,
                t1.status,
                t1.[group],
                t2.traitname,
                t3.trait
              from table1 t1
              left join table3 t3
                on t1.aid = t3.aid
              left join table2 t2
                on t3.atid = t2.atid
            ) x
            pivot 
            (
                max(trait)
                for traitname in (' + @cols + ')
            ) p '

execute sp_executesql @query;
作为旁注,很难判断联接列上的数据类型。由于
A3
值,您的
Table1.aid
列似乎是varchar,但您的
Table3.aid
列看起来是
int
。如果数据类型不同,则需要在联接上强制转换数据,类似于--
on t1.aid=cast(t3.aid as varchar(10))