Sql 加入每个组的每个可能组合
我有两张桌子Sql 加入每个组的每个可能组合,sql,tsql,sql-server-2008,Sql,Tsql,Sql Server 2008,我有两张桌子 T1 order1 grp ----------- ----------- 1 1 2 1 3 1 4 1 1 2 2 2 3 2 T2 order1 count1 abbrev grp ----------- ----------- ------ ----------- 2 5
T1
order1 grp
----------- -----------
1 1
2 1
3 1
4 1
1 2
2 2
3 2
T2
order1 count1 abbrev grp
----------- ----------- ------ -----------
2 5 A 1
1 17 B 2
2 11 B 2
这些表通过以下方式连接:
SELECT
t2.grp, t2.order1, t2.count1, t2.abbrev
FROM t2
JOIN t1
ON
t1.grp = t2.grp and
t1.order1 = t2.order1
结果:
grp order1 count1 abbrev
----------- ----------- ----------- ------
1 2 5 A
2 1 17 B
2 2 11 B
问题是,我需要为每个组的每个可能组合指定一行:
grp order1 count1 abbrev
----------- ----------- ----------- ------
1 1 0 A
1 2 5 A
1 3 0 A
1 4 0 A
2 1 17 B
2 2 11 B
2 3 0 B
如果grp=1,order=2的结果是abbrev=C,那么结果会是什么样的?您应该将数据标准化,以便将组放在一个单独的表中。group和abbrev齐头并进,一个是我遇到的情况中的前导文本,另一个是该文本的id。@t-clausen.dk:您的模型没有标准化。将JOIN替换为RIGHT JOIN,抛出一个外部APPLY以选择缺少行的abbrev,并将输出字段扭曲为COALESCE。它用于存储问题的数据。如果我在任何表中更改1个逗号,我们将失去整个系统的所有支持。最初的问题要复杂得多,但我抓住了要点,把它简化成可读的
SELECT
cube.grp,
cube.order,
ISNULL(data.count, 0),
chars.abbrev
FROM
@t1 AS cube
INNER JOIN
(SELECT grp, abbrev FROM @t2 GROUP BY grp, abbrev) AS chars
ON chars.grp = cube.grp
LEFT JOIN
@t2 AS data
ON data.grp = cube.grp
AND data.order = cube.order
AND data.abbrev = chars.abbrev