Sql server 2008 T-SQL:减少SQL Server中的左外部联接

Sql server 2008 T-SQL:减少SQL Server中的左外部联接,sql-server-2008,tsql,join,distinct,Sql Server 2008,Tsql,Join,Distinct,有更好更简单的方法吗?假设我有500多个小组。要做到这一点需要大量的连接。在下面的示例中,我只有3个左外连接,因此这相对简单。如果有更好的方法对此进行建模,而不使用这些奇怪的连接,那么也可以很好地看到(可能有一个映射表/桥接表) 你在找这个吗 SELECT [user].id, '2010-01-01' AS begin_date, CASE WHEN group_a.type = '1' OR group_a.type = '2'

有更好更简单的方法吗?假设我有500多个小组。要做到这一点需要大量的连接。在下面的示例中,我只有3个左外连接,因此这相对简单。如果有更好的方法对此进行建模,而不使用这些奇怪的连接,那么也可以很好地看到(可能有一个映射表/桥接表)


你在找这个吗

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
试一试


“假设我有500多个组”您是否建议500多个列显示用户在所有组中的注册?我建议不要旋转这个。如果我们做旋转,SQL会是什么样子?但我们每个群体仍然有不同的类型值。我同意哈姆雷特的回答。您可以进一步讨论这个问题,根据组类型合并约定或创建人行横道表。
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
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