#sql #select #subquery
#sql #выберите #подзапрос
Вопрос:
У меня возникли проблемы с обертыванием моего мозга вокруг вложенного подзапроса в инструкции select sql. В принципе, то, что у меня здесь есть, работает нормально, но определенно должен быть способ сделать этот запрос более динамичным и элегантным, чем текущая настройка ниже:
SELECT Jobs.JobID, Jobs.JobName,
(
SELECT COALESCE(SUM(JobQualifiers.Weight), 0)
FROM Jobs j1
INNER JOIN
JobQualifiers ON j1.JobID = JobQualifiers.JobID
INNER JOIN
Qualifications ON Qualifications.QualificationID = JobQualifiers.QualificationID
INNER JOIN
SubGroupQualifiers sgq ON Qualifications.QualificationID = sgq.QualificationID
INNER JOIN
QualificationSubGroups ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID
WHERE
j1.JobID = Jobs.JobID
AND
QualificationSubGroups.QualificationSubGroupID = 6
) as SubGroup6,
(
SELECT
COALESCE(SUM(JobQualifiers.Weight), 0)
FROM Jobs j2
INNER JOIN
JobQualifiers ON j2.JobID = JobQualifiers.JobID
INNER JOIN
Qualifications ON Qualifications.QualificationID = JobQualifiers.QualificationID
INNER JOIN
SubGroupQualifiers sgq ON Qualifications.QualificationID = sgq.QualificationID
INNER JOIN
QualificationSubGroups ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID
WHERE
j2.JobID = Jobs.JobID
AND
QualificationSubGroups.QualificationSubGroupID = 7
) as SubGroup7,
(
SELECT COALESCE(SUM(JobQualifiers.Weight), 0)
FROM Jobs j3
INNER JOIN
JobQualifiers ON j3.JobID = JobQualifiers.JobID
INNER JOIN
Qualifications ON Qualifications.QualificationID = JobQualifiers.QualificationID
INNER JOIN
SubGroupQualifiers sgq ON Qualifications.QualificationID = sgq.QualificationID
INNER JOIN
QualificationSubGroups ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID
WHERE
j3.JobID = Jobs.JobID
AND
QualificationSubGroups.QualificationSubGroupID = 8
) as SubGroup8
FROM Jobs
Моя цель здесь — сделать выбор подзапроса динамическим, а не жестко закодированным в QualificationSubGroups.QualificationSubGroupID с Subgroup6, SubGroup7, SubGroup8 и т.д. Я считаю, что мне нужен вложенный подзапрос, но как его реализовать, я не понимаю. Это может быть невероятно неоднозначным описанием, поэтому я был бы рад предоставить более подробную информацию по мере необходимости! Заранее спасибо за любые ответы.
Комментарии:
1. Вы могли бы попробовать что-то вроде этого — ВЫБЕРИТЕ СЛУЧАЙ, КОГДА QualificationSubGroups.QualificationSubGroupID = 6 ЗАТЕМ SUM(JobQualifiers. Вес) ЕЩЕ 0 В КАЧЕСТВЕ подгруппы 6 ИЗ заданий СЛЕВА ПРИСОЕДИНЯЮТСЯ К JobQualifiers J1 На j1.JobID = JobQualifiers. JobID ОСТАВИЛ JOIN Qualifications НА квалификациях. QualificationID = JobQualifiers.QualificationID СЛЕВА ПРИСОЕДИНЯЕТСЯ К SubGroupQualifiers sgq ПО квалификациям. QualificationID = sgq.QualificationID СЛЕВА ПРИСОЕДИНЯЕТСЯ К QualificationSubGroups В QualificationSubGroups.QualificationSubGroupID = sgq. Идентификатор подгруппы
2. Я не думаю, что вы можете обойти жесткое кодирование идентификаторов подгрупп, даже если в конечном итоге вы используете сводную. Итак, если количество ваших подгрупп невелико и конечно, вы также можете использовать оператор case
Ответ №1:
Вместо нескольких подвыборок вы могли бы использовать условную агрегацию, что-то вроде:
SELECT j.JobID
, j.JobName
, COALESCE(SUM(CASE WHEN qsg.QualificationSubGroupID = 6 THEN jq.Weight END), 0)
, COALESCE(SUM(CASE WHEN qsg.QualificationSubGroupID = 7 THEN jq.Weight END), 0)
, COALESCE(SUM(CASE WHEN qsg.QualificationSubGroupID = 8 THEN jq.Weight END), 0)
FROM Jobs j
INNER JOIN JobQualifiers jq ON j.JobID = jq.JobID
INNER JOIN Qualifications q ON q.QualificationID = jq.QualificationID
INNER JOIN SubGroupQualifiers sgq ON q.QualificationID = sgq.QualificationID
INNER JOIN QualificationSubGroups qsg ON qsg.QualificationSubGroupID = sgq.SubGroupID
WHERE qsg.QualificationSubGroupID IN (6,7,8)
GROUP BY j.JobID
, j.JobName
Ответ №2:
Я не уверен точно, что вы пытаетесь сделать, но вы можете попробовать, как показано ниже, используя CASE
условие
SELECT Jobs.JobID, Jobs.JobName,
CASE WHEN QualificationSubGroups.QualificationSubGroupID = 6
THEN COALESCE(SUM(JobQualifiers.Weight), 0) END as SubGroup6,
CASE WHEN QualificationSubGroups.QualificationSubGroupID = 7
THEN COALESCE(SUM(JobQualifiers.Weight), 0) END as SubGroup7,
CASE WHEN QualificationSubGroups.QualificationSubGroupID = 8
THEN COALESCE(SUM(JobQualifiers.Weight), 0) END as SubGroup8
FROM Jobs j1
INNER JOIN
JobQualifiers ON j1.JobID = JobQualifiers.JobID
INNER JOIN
Qualifications
ON Qualifications.QualificationID = JobQualifiers.QualificationID
INNER JOIN
SubGroupQualifiers sgq
ON Qualifications.QualificationID = sgq.QualificationID
INNER JOIN
QualificationSubGroups
ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID