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))