我有两张表Q
和A
,
记录为A
QID UserID Value
1 100 A
2 100 B
3 100 C
1 101 AA
2 101 BB
3 101 CC
1 102 AAA
2 102 BBB
如您所见,QID 102
的用户3
没有记录。还有另一个表Q
。
QID Value
1 Name
2 Email
3 Site
我想要的是,对于每个用户,天气他们已经回答了一个问题(即,A
表中是否有一个条目退出)我想要所有用户及其答案的所有问题。这样的事情。
QID QValue UserID Value
1 Name 100 A
2 Email 100 B
3 Site 100 C
1 Name 101 AA
2 Email 101 BB
3 Site 101 CC
1 Name 102 AAA
2 Email 102 BBB
问题是什么所需输出中缺少一行,即
3 Site 102 NULL
因为对于用户102
,A
表中没有条目。我试过LEFT JOIN
,但显然它不会给出所需的结果,因为所有的左表都已存在。并且INNER JOIN
也不起作用。
答案表(表格A
)也可以完成这样的数据
QID QValue UserID Value
1 Name 100 A
2 Email 101 BB
3 Site 102 CCC
比如说,所有用户只填写了一条记录,在这种情况下,所需的输出就是这样的
QID QValue UserID Value
1 Name 100 A
2 Email 100 NULL
3 Site 100 NULL
1 Name 101 NULL
2 Email 101 BB
3 Site 101 NULL
1 Name 102 NULL
2 Email 102 NULL
3 Email 102 CCC
如果我在LEFT JOIN
上QID
,它就不起作用。请建议应该做些什么。
答案 0 :(得分:1)
试试这个:
declare @A table(QID int, UserID int, Value varchar(10))
declare @Q table(QID int, Value varchar(10))
insert into @A values (1, 100, 'A')
insert into @A values (2, 100, 'B')
insert into @A values (3, 100, 'C')
insert into @A values (1, 101, 'AA')
insert into @A values (2, 101, 'BB')
insert into @A values (3, 101, 'CC')
insert into @A values (1, 102, 'AAA')
insert into @A values (2, 102, 'BBB')
insert into @Q values (1, 'Name')
insert into @Q values (2, 'Email')
insert into @Q values (3, 'Site')
select
U.UserID,
Q.QID,
Q.Value as QValue,
A.Value
from
(select distinct UserID from @A) U -- all Users
cross join @Q Q -- all Questions
left outer join @A A on A.UserID = U.UserID and A.QID = Q.QID
所以基本上你在所有问题和所有用户之间进行cross join
以获得所有组合。然后你得到这个结果并用left join
做所有答案。缺少答案的NULL
(真实答案)字段中会显示Value
个值。