Sql Server - 使用CTE组合多个表中的值而不加入

时间:2014-03-24 20:40:32

标签: sql-server-2008 common-table-expression

我一直在使用CTE来构建一些我需要的特殊格式的表,只要数据来自一个表或我可以加入,这一直很好用,但现在我遇到了一个情况我没有任何共同的领域可以加入。

这是理想的最终结果

+------+---------+
| p_id | value   | 
+------+---------+
| 1    | 1,55556 |
| 2    | 2,1212  |
| 3    | 2,6868  |
| 4    | 2,4545  |
| 5    | 1,55557 |
| 6    | 2,1212  |
| 7    | 2,6868  |
| 8    | 2,4545  |
+------+---------+

以下是一些示例表

CREATE TABLE Table1
 ([Emp_ID] varchar(10))
;

INSERT INTO Table1
 ([Emp_ID])
VALUES
 (55556), 
 (55557)
;

CREATE TABLE Table2
 ([Type] Varchar(10), [Type_ID] varchar(10))
;

INSERT INTO Table2
 ([Type], [Type_ID])
VALUES
 ('Black', '1212'),
 ('Red', '6868'),
 ('Orange', '4545')
;

这是CTE使用单个表

GO
WITH cte as (
    SELECT t1.[emp_id], C.Value
    FROM table1 t1
        outer apply (values
            ('1,' + t1.[emp_id])
       ) as C(Value)
)

SELECT
    row_number() over(order by [emp_id], value) as p_id,
    value
FROM cte

但我想要的是这样的......除非我这样做,否则我会用"多部分标识符" t1.emp_id"无法绑定"

GO
WITH cte as (
    SELECT t1.[emp_id], C.Value
    FROM table1 t1, table2 t2
        outer apply (values
            ('1,' + t1.[emp_id]),
            ('2,' + t2.type_id)
       ) as C(Value)
)

SELECT
    row_number() over(order by [emp_id], value) as p_id,
    value
FROM cte

现在,我可以做我以前做过的事情,这是为每个值创建一个单独的列,除了这次我在table2中处理我需要插入的数百个值,这样就不再实用了。

提前感谢任何建议。

1 个答案:

答案 0 :(得分:1)

以下是获得所需输出的方法。但我觉得我错过了这一点:

with cte as
(
  select '2,'+type_id as value, emp_id
  from table1 t1, table2 t2

  union all

  select '1,'+emp_id as value, emp_id
  from table1  
)
select value,
  row_number() over(order by emp_id, value) as p_id
from cte