2015-12-25 1 views
1

У меня есть две таблицы, и я хочу, чтобы объединить данные в третьей таблице, как показано ниже,запрос, чтобы переместить значение из столбцов к строкам

Таблица 1:

User Id Account1 Account 2 
------- -------- --------- 
Lucky Twitter Facebook 
Happy Orkut  GooglePlus 

Таблица 2

User Id AccountStatus 
------- ------------- 
Lucky Active 

Я хочу, чтобы результат как:

UserId Account 
------ -------- 
Lucky Twitter 
Lucky Facebook 

Любая идея о том, как это сделать?

ответ

2

всего unpivot данные, чтобы получить результат в формате

с помощью CROSS APPLY оператора

SELECT [user id], 
     account 
FROM table1 A 
     CROSS apply (VALUES (account1), 
          (account2)) cs(account) 
WHERE EXISTS (SELECT 1 
       FROM table2 B 
       WHERE A.[user id] = B.[user id] 
       AND B.AccountStatus = 'Active') 

или использовать UNION ALL для unpivot данные

SELECT * 
FROM (SELECT [user id], 
       account1 as account 
     FROM table1 
     UNION ALL 
     SELECT [user id], 
       account2 
     FROM table1) A 
WHERE EXISTS (SELECT 1 
       FROM table2 B 
       WHERE A.[user id] = B.[user id] 
       AND B.AccountStatus = 'Active') 
1

SQL Server имеет встроенную поддержку UNPIVOT, поэтому вы должны использовать его:

SELECT UserI 
FROM 
(
    SELECT A.UserId, Account1, Account2 
    FROM Account A 
     JOIN AccountStatus S ON S.UserId = A.UserId 
    WHERE S.AccountStatus = 'Active' 
) AS acc 
UNPIVOT 
(
    Account FOR Acc IN (Account1, Account2) 
) AS up; 

Я не знаю, если это быстрее, но это позволяет легко расширить свои типы счетов, просто путем добавления столбцов в двух местах (SELECT и внутри UNPIVOT).

1
; With cteActiveAccount As(
    Select UserId 
    From Table2 where AccountStatus = 'Active' 
) 
, cteAccountFilterdOnes As(
    Select r.UserId 
     r.Account1 as Account 
    from Table1 r 
    inner join cteActiveAccount c on 
     r.UserId = c.UserId 
    union all 
    Select r.UserId 
     r.Account2 as Account 
    from Table1 r 
    inner join cteActiveAccount c on 
     r.UserId = c.UserId 
) 

выберите * из cteAccountFilterdOnes