0

簡単な手順を書くのに助けが必要です。私がやろうとしていることを説明しましょう。

私は3つのテーブルを持っています

  1. tJobOffer
  2. t用途
  3. tApplicationStatus

この tJobOffer に応答した候補者の数を含む tJobOffer のリストを返すプロシージャを作成したいと思います。Candidate は、私のテーブル tApplicationStatus のステータスです。このテーブルは、tJobOffer にリンクされている tApplication にリンクされています。アプリケーションは、CANDIDATE / ACCEPTED / REFUSED / IGNORED / ... のいずれかになります。

このクエリを作成しました:

    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 の候補は 1 つしかないため、これは正しくありません。

    --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
4

4 に答える 4

1

私はあなたがこれを望んでいると思います:

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] ;

JobOffer最初に2つの「アプリケーション」テーブルを結合し、グループ化してから、派生テーブルを次のように結合することもできます。

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] ;
于 2013-01-03T09:24:25.560 に答える
1

あなたの要件に従って、最初に内部結合を使用する必要がある後、そこで左結合を使用する必要があります。

以下のものを試してください

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] ;
于 2013-01-03T09:38:54.237 に答える
0

2番目のLEFTJOINのON句でフィルタリングした行がまだ最終結果に表示される理由を尋ねているかどうかはわかりません。

それがあなたの質問である場合、答えは次のとおりです。

ON述部に基づくフィルターは最終的なものではありません。つまり、ON述部は、行が出力に表示されるかどうかを決定せず、他のテーブルの行と一致するかどうかのみを決定します。

一方、WHERE句はfinalであり、FROM句の後に処理されます。つまり、すべてのテーブル演算子が処理された後、および(外部結合の場合)すべての外部行が生成された後に処理されます。

したがって、外側の行が生成された後にフィルターを適用する必要があり、フィルターをfinalにする場合は、WHERE節で述部を指定します。

于 2013-01-03T09:25:23.270 に答える
0

これを試して:

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]
于 2013-01-03T09:09:43.097 に答える