Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 加入每个组的每个可能组合_Sql_Tsql_Sql Server 2008 - Fatal编程技术网

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