2013-10-10 5 views
-1

Есть ли лучший и простой способ сделать это? Предположим, у меня 500 групп. Для этого требуется много совместных действий. В приведенном ниже примере у меня есть только 3 LEFT OUTER, поэтому это относительно просто. Если есть лучший способ моделировать это, без этих странных объединений, это может быть и аккуратным, чтобы видеть (а может, иметь таблицу сопоставления/таблицы моста)?T-SQL: сокращение подключений LEFT OUTER в SQL Server

SELECT 
    [user].id, 
    '2010-01-01' AS begin_date, 
    group_a.source AS group_a_id, 
    group_b.source AS group_b_id, 
    group_c.source AS group_c_id 
FROM 
    (select distinct id FROM [user]) [user] 
    LEFT OUTER JOIN [group] group_a ON user.id = group_a.user_id and group_a.type in ('1', '2', '5') 
    LEFT OUTER JOIN [group] group_b ON user.id = group_b.user_id and group_b.type = '3' 
    LEFT OUTER JOIN [group] group_c ON user.id = group_c.user_id and group_c.type = '4' 
+1

«Предположим, у меня есть 500+ группы» Вы предлагаете вы хотите 500+ столбцы, чтобы показать регистрацию пользователя во всех группах? Могу я предложить не поворачивать это. –

+0

Что будет выглядеть SQL, если бы мы сделали свод? Но у нас все еще есть разные значения типа для каждой группы. – MacGyver

ответ

1

Вы искали это?

SELECT 
    [user].id, 
    '2010-01-01' AS begin_date, 
    CASE WHEN group_a.type = '1' 
       OR group_a.type = '2' 
       OR group_a.type = '5' THEN group_a.source END AS group_a_id, 
    CASE WHEN group_a.type = '3' THEN group_a.source END AS group_b_id, 
    CASE WHEN group_a.type = '4' THEN group_a.source END AS group_c_id 
FROM 
    (select distinct id FROM [user]) [user] 
    LEFT OUTER JOIN [group] group_a ON user.id = group_a.user_id 
+0

Я согласен с ответом Гамлета. Вы могли бы поговорить об этом еще дальше, включить соглашение, основанное на групповом типе, или создать таблицу перекрестка. – jcwrequests

0

попробовать

SELECT 
    [user].id, 
    '2010-01-01' AS begin_date, 
    CASE WHEN group_a.type = '1' 
       OR group_a.type = '2' 
       OR group_a.type = '5' THEN group_a.source END AS group_a_id, 
    CASE WHEN group_a.type = '3' THEN group_a.source END AS group_b_id, 
    CASE WHEN group_a.type = '4' THEN group_a.source END AS group_c_id 
FROM 
    (select distinct id FROM [user]) [user] 
    LEFT OUTER JOIN [group] group_a ON user.id = group_a.user_id