Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要左连接SQL查询的帮助_Sql_Sql Server 2008_Join - Fatal编程技术网

我需要左连接SQL查询的帮助

我需要左连接SQL查询的帮助,sql,sql-server-2008,join,Sql,Sql Server 2008,Join,我需要帮助写一个简单的程序。让我解释一下我想做什么 我有三张桌子 tJobOffer 应用 应用状态 我想创建一个程序,返回一个tJobOffer列表,其中包含响应此tJobOffer的候选人数量。候选人是我表格申请状态的一个状态。此表链接到链接到tJobOffer的tApplication。申请可以是候选/接受/拒绝/忽略/ 我创建了这个查询: SELECT [T].[JobOfferId], [T].[JobOfferTitle],

我需要帮助写一个简单的程序。让我解释一下我想做什么

我有三张桌子

  • tJobOffer
  • 应用
  • 应用状态
  • 我想创建一个程序,返回一个tJobOffer列表,其中包含响应此tJobOffer的候选人数量。候选人是我表格申请状态的一个状态。此表链接到链接到tJobOffer的tApplication。申请可以是候选/接受/拒绝/忽略/

    我创建了这个查询:

        SELECT 
            [T].[JobOfferId],
            [T].[JobOfferTitle],
            COUNT([A].[ApplicationId]) AS [CandidateCount]
    
        FROM        [tJobOffer] AS [T]
        LEFT JOIN   [tApplication] AS [A]
            ON      [A].[JobOfferId] = [T].[JobOfferId]
        LEFT JOIN   [tApplicationStatus] AS [S]
            ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
            AND     [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
    
        GROUP BY
                [T].[JobOfferId],
                [T].[JobOfferTitle]
                --[A].[ApplicationStatusId]
    
        ORDER BY [T].[JobOfferTitle]
    
    结果是

    > 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA  Annonce 1   0
    > F26B228D-0C81-4DA8-A287-F8F997CC1F9C  Annonce 1b  0
    > 9DA60B23-F113-4C7F-9707-2B90C1556D5D  Announce 25 2
    > 258E11A7-79C1-47B6-8C61-413AA54E2360  Announce 3  0
    > DA582383-5DF4-4E1D-837C-382371BDEF57  Announce 6  2
    
    这是不正确的,因为我只有一个候选人宣布6。如果有人把我的路线

        --AND     [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
    
    在注释中,结果是相同的。我的问题似乎忽略了这一行。怎么了

    编辑--

    我的正确结果应该是

    > 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA  Annonce 1   0
    > F26B228D-0C81-4DA8-A287-F8F997CC1F9C  Annonce 1b  0
    > 9DA60B23-F113-4C7F-9707-2B90C1556D5D  Announce 25 2
    > 258E11A7-79C1-47B6-8C61-413AA54E2360  Announce 3  0
    > DA582383-5DF4-4E1D-837C-382371BDEF57  Announce 6  1
    
    试试这个:

    SELECT 
            [T].[JobOfferId],
            [T].[JobOfferTitle],
            COUNT([A].[ApplicationId]) AS [CandidateCount]
    
        FROM        [tJobOffer] AS [T]
        LEFT JOIN   [tApplication] AS [A]
            ON      [A].[JobOfferId] = [T].[JobOfferId]
        LEFT JOIN   
             (SELECT ApplicationStatusId FROM [tApplicationStatus]
              WHERE  [ApplicationStatusTechnicalName] = 'CANDIDATE') [S]
            ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
        GROUP BY
                [T].[JobOfferId],
                [T].[JobOfferTitle]
        ORDER BY [T].[JobOfferTitle]
    
    我猜你想要这个:

    SELECT 
        [T].[JobOfferId],
        [T].[JobOfferTitle],
        COUNT([A].[ApplicationId]) AS [CandidateCount]
    
    FROM        [tJobOffer] AS [T]
    LEFT JOIN   [tApplication] AS [A]
        INNER JOIN  [tApplicationStatus] AS [S]
            ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
            AND     [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
        ON      [A].[JobOfferId] = [T].[JobOfferId]
    
    GROUP BY
            [T].[JobOfferId],
            [T].[JobOfferTitle]
    
    ORDER BY [T].[JobOfferTitle] ;
    
    您还可以先连接2个“应用程序”表,分组,然后使用
    JobOffer
    连接派生表:

    SELECT 
        [T].[JobOfferId],
        [T].[JobOfferTitle],
        COALESCE([G].[Cnt], 0) AS [CandidateCount]
    
    FROM        [tJobOffer] AS [T]
    LEFT JOIN   
                ( SELECT 
                      [A].[JobOfferId],
                      COUNT(*) AS [Cnt]
    
                  FROM        [tApplication] AS [A]
                  INNER JOIN  [tApplicationStatus] AS [S]
                      ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
                      AND     [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
    
                  GROUP BY
                              [A].[JobOfferId]
                ) AS [G]
        ON      [G].[JobOfferId] = [T].[JobOfferId]
    
    ORDER BY [T].[JobOfferTitle] ;
    

    我不确定您是否在问,为什么使用第二个左连接的ON子句筛选的行仍然显示在最终结果中

    如果这是你的问题,那么答案是:

    基于on谓词的筛选器不是最终筛选器,即on谓词不确定该行是否显示在输出中,只确定它是否与其他表中的行匹配

    另一方面,WHERE子句是final,在FROM子句之后处理,即在处理所有表运算符之后,以及(在外部联接的情况下)在生成所有外部行之后


    因此,当您需要在生成外部行之后应用过滤器,并且希望过滤器是最终过滤器时,请在WHERE子句中指定谓词

    根据您的要求,在必须使用内部联接之后,首先需要使用左联接

    试试下面这个

    SELECT 
        [T].[JobOfferId],
        [T].[JobOfferTitle],
        COUNT([A].[ApplicationId]) AS [CandidateCount]
    
    FROM        [tJobOffer] AS [T]
    LEFT JOIN   [tApplication] AS [A]
        INNER JOIN   [tApplicationStatus] AS [S]
            ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
            AND     [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
        ON      [A].[JobOfferId] = [T].[JobOfferId]
    
    GROUP BY
            [T].[JobOfferId],
            [T].[JobOfferTitle]
    
    ORDER BY [T].[JobOfferTitle] ;
    

    如果您可以添加带有所需结果的示例记录,并回答您的问题
    :D
    如果您没有在任何地方使用它,为什么要以[S]的身份加入
    [tApplicationStatus]呢?正确。非常感谢。我不知道可以加入加入加入。