【问题标题】:SQL select statement nested sub queriesSQL select 语句嵌套子查询
【发布时间】:2014-07-01 18:53:48
【问题描述】:

我无法在 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

我的目标是使子查询选择动态而不是硬编码为具有 Subgroup6、SubGroup7、SubGroup8 等的 QualificationSubGroups.QualificationSubGroupID。我相信我需要一个嵌套子查询,但如何实现它超出了我的范围。这可能是令人难以置信的模棱两可的描述,所以我很乐意根据需要提供更多细节!提前感谢您的任何回复。

【问题讨论】:

  • 你可以尝试这样的事情 - SELECT CASE WHEN QualificationSubGroups.QualificationSubGroupID = 6 THEN SUM(JobQualifiers.Weight) ELSE 0 AS SubGroup6 FROM Jobs LEFT JOIN JobQualifiers J1 ON j1.JobID = JobQualifiers.JobID LEFT JOIN Qualifications ON Qualifications.QualificationID = JobQualifiers.QualificationID LEFT JOIN SubGroupQualifiers sgq ON Qualifications.QualificationID = sgq.QualificationID LEFT JOIN QualificationSubGroups ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID
  • 我认为即使您最终使用 Pivot,也无法绕过对 SubGroupId 进行硬编码。因此,如果您的子组的数量很小且有限,那么您也可以使用 case 语句

标签: sql select subquery


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2013-12-06
      • 2015-08-02
      • 2010-09-12
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 2011-11-12
      相关资源
      最近更新 更多