Нужно объединить два запроса - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть один запрос, в котором нет ничего особенного.Базовый выбор и множество объединений, но ничего сложного.

У меня есть второй запрос, в котором используются курсор и опорная точка.Это такой же сложный запрос, как я когда-либо делал (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]

Я пытался просматривать подзапросы, но они, похоже, довольно ограничивают то, что я делаю.

1 Ответ

0 голосов
/ 28 февраля 2019

Оба запроса можно упростить до одного, просто добавив другой 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

Примечание: это стандартный ANSI SQL, который должен работать на большинстве СУБД.

...