2014-11-17 2 views
0

У меня есть две таблицы 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 

Как вы можете видеть, что нет записи для пользователя 102 для QID 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 

Say, все пользователи просто заполнили в одной записи, в этом случае желаемый результат что-то вроде этого

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, он не работает. Пожалуйста, предложите, что делать.

+1

Что вы пробовали? Что вы подразумеваете под словом «Если я делаю LEFT JOIN на QID, это не работает»? Как насчет некоторых данных ddl и образцов? sqlfiddle.com - отличное место для начала. –

+0

Загляните в CROSS JOIN без каких-либо условий, вы хотите ПЕРЕСЕЧИТЬ ПРИСОЕДИНЯЙТЕСЬ к своим Пользователям и вашим вопросам и присоединиться к своим ответам. – mxix

ответ

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 (реальный ответ).

Смежные вопросы