Я использую 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

Теперь я мог бы сделать то, что делал раньше, а именно создать отдельный столбец для каждого значения, за исключением того, что на этот раз я имею дело с сотней значений в таблице 2, которые мне нужно вставить, так что это больше не практично.

Спасибо заранее за любые предложения.

0
Jeremy 25 Мар 2014 в 00:40

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
2
TomT 25 Мар 2014 в 02:45
Это оно! Я не знаю, мог бы я передать то, что делаю, без написания параграфов подряд, но это выполняет именно то, что я пытался сделать, в основном я пытаюсь вывести текстовый файл, в котором в качестве первого элемента указан employee_id, а затем каждый из двух элементов в своем профиле определено что-то, что импортируется. Это очень помогло, спасибо Том!
 – 
Jeremy
25 Мар 2014 в 05:22