У меня есть один запрос, в котором нет ничего особенного. Базовый выбор и множество объединений, но ничего продвинутого.
У меня есть второй запрос, который использует курсор и поворот. Это самый сложный запрос, который я когда-либо делал (SQL noob). Что я хотел бы сделать, так это вставить второй запрос в первый и каким-то образом использовать выходные данные строки первого запроса во втором. Запутанно, я знаю.
Второй запрос выглядит так:
declare @num as varchar(50)
declare pno cursor for
select
p.part_key
from
part_table as p
where
p.part_status = "Prod"
open pno
fetch next from pno into @num
while @@fetch_status = 0
begin
select
@num as "Part Number",
[id1] as "Data1",
[id2] as "Data2",
[id3] as "Data3"
from
select
t1.qty * t2.cost as ExtCost,
t2.opcode as opcode
from
table1 as t1
join table2 as t2
on t1.id = t2.id
where
t1.part_key = @num
) t
pivot
(sum(extcost) for opcode in [id1], [id2], [id3])) pvt
fetch next from pno into @num
end
close pno
deallocate pno
Этот запрос выдает именно то, что мне нужно, и это единственный известный мне способ получить эту информацию. И первый запрос выдает другую информацию, но ссылается на ту же группу «частей», которые я выбираю в этом сводном запросе. Итак, что я хотел бы сделать, так это для каждой строки (т.е. part_key) в первом запросе я хочу выдать данные из второго запроса, связанные с этим part_key.
Так, например, первый запрос выдает что-то вроде этого:
PART KEY | q1DATA1 | q1DATA2
И второй запрос выдает:
PART KEY | [id1] | [id2] | [id3]
Я хочу сделать следующее:
PART KEY | q1DATA1 | q1DATA2 | [id1] | [id2] | [id3]
Я пытался смотреть на подзапросы, но они, кажется, довольно ограничивают то, что я делаю.


Оба запроса можно упростить в один, просто добавив еще один JOIN ко второму запросу. Я понимаю, что эти пункты FROM/WHERE должны помочь:
FROM
part_table as p
INNER JOIN table1 AS t1 ON t1.part_key = p.part_key
INNER JOIN table2 AS t2 ON t2.id = t1.id
WHERE
p.part_status = 'Prod'
Когда дело доходит до поворота вывода, я подозреваю, что то, чего вы пытаетесь достичь, можно сделать с помощью условная агрегация.
SELECT
p.part_key,
p.q1DATA1,
p.q1DATA2,
SUM(CASE WHEN t2.opcode = '[id1]' THEN t1.qty * t2.cost ELSE 0 END) id1,
SUM(CASE WHEN t2.opcode = '[id2]' THEN t1.qty * t2.cost ELSE 0 END) id2,
SUM(CASE WHEN t2.opcode = '[id3]' THEN t1.qty * t2.cost ELSE 0 END) id3,
FROM
part_table as p
INNER JOIN table1 AS t1 ON t1.part_key = p.part_key
INNER JOIN table2 AS t2 ON t2.id = t1.id
WHERE
p.part_status = 'Prod'
GROUP BY
p.part_key,
p.q1DATA1,
p.q1DATA2
NB: это стандартный ANSI SQL, который должен работать на большинстве СУБД.
Пожалуйста, прочитайте первый абзац информация о теге sql и редактировать вашего вопроса соответственно.