左连接获取两个表中的所有数据

时间:2014-11-17 15:20:22

标签: sql-server select join

我有两张表QA

记录为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

因为对于用户102A表中没有条目。我试过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 JOINQID,它就不起作用。请建议应该做些什么。

1 个答案:

答案 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个值。

相关问题