1

動作しない SQL コードの一部を次に示します。

SELECT bl.regn_id,
   RTRIM(LTRIM(dv.dv_id))   + '_' + RTRIM(LTRIM(bl.regn_id)) AS bu_regn,
   (SELECT COUNT (em.em_id) 
      FROM em 
        LEFT OUTER JOIN bl bl_s ON em.bl_id = bl_s.bl_id
        LEFT OUTER JOIN irs_self_cert_em  ON  em.em_id = irs_self_cert_em.em_id
      WHERE dv.dv_id = em.dv_id
      AND bl.bl_id = bl_s.bl_id
      AND irs_self_cert_em.date_cert_loc >= DATEADD(month, -1, GETDATE())
      AND (em.date_last_update_cads >= (select date_last_update_completed FROM ddi_completed WHERE ddi_id='TRA_CADS_EM'))          
    ) AS certified 
FROM bl       
    CROSS JOIN dv 
    WHERE bl.status = 'A'  AND (certified > 0 )

「ルックアップ エラー - SQL Server データベース エラー: 無効な列名 'certified'」というエラーが表示されます。

ご覧のとおり、SELECT ステートメント内でサブクエリを使用し、「certified」という名前を付けています。次に、その値を WHERE 句で使用しようとします。

誰かがこれを達成するための代替方法を提案できますか?

どうもありがとう、マット

4

3 に答える 3

1

WHERE 句ではエイリアス化された (計算された) 列を使用できません。別のサブクエリを作成して、そのフィールドに条件を追加します。

SELECT * FROM
(
    SELECT
        bl.regn_id,
        RTRIM(LTRIM(dv.dv_id))   + '_' + RTRIM(LTRIM(bl.regn_id)) AS bu_regn,
       (
            SELECT
                COUNT(em.em_id) AS [Count]
            FROM
                em LEFT OUTER JOIN bl AS bl_s
                    ON
                        em.bl_id = bl_s.bl_id LEFT OUTER JOIN irs_self_cert_em
                            ON
                                em.em_id = irs_self_cert_em.em_id
            WHERE
                dv.dv_id = em.dv_id
                    AND
                bl.bl_id = bl_s.bl_id
                AND
                    irs_self_cert_em.date_cert_loc >= DATEADD(month, -1, GETDATE())
                AND
                    (em.date_last_update_cads >= (select date_last_update_completed FROM ddi_completed WHERE ddi_id='TRA_CADS_EM'))          
        ) AS certified
    FROM
        bl CROSS JOIN dv 
    WHERE
        bl.status = 'A'
) AS temp
    WHERE
        certified > 0

また、クエリを少しクリーンアップしようとしました。右のサイド テーブルの基準でを使用しLEFT OUTER JOINていたので、本当にINNER JOIN(INNER JOINはより効率的/迅速に機能します) でした。確認して、これが期待どおりに機能するかどうかをお知らせください。

;WITH
cte AS
(
    SELECT
        bl.regn_id,
        RTRIM(LTRIM(dv.dv_id))   + '_' + RTRIM(LTRIM(bl.regn_id)) AS bu_regn
        COUNT(*) OVER (PARTITION BY bl.regn_id, dv.dv_id, bl.regn_id ORDER BY bl.regn_id) AS [Certified]
    FROM
        dv INNER JOIN em
            ON
                dv.dv_id = em.dv_id INNER JOIN JOIN bl
                    ON
                        em.bl_id = bl.bl_id INNER JOIN JOIN irs_self_cert_em
                            ON
                                em.em_id = irs_self_cert_em.em_id
    WHERE
        bl.status = N'A'
            AND
        irs_self_cert_em.date_cert_loc >= DATEADD(month, -1, GETDATE())
            AND
        (em.date_last_update_cads >= (select date_last_update_completed FROM ddi_completed WHERE ddi_id='TRA_CADS_EM')
)
SELECT
    DISTINCT
    *
FROM
    cte
WHERE
    Certified > 0
于 2013-07-26T14:41:57.233 に答える
1

テーブル構造 (例: どの ID が一意かを知るため) がないと、それらに関連するいくつかのデータと、出力を希望する方法を言うのは難しく、テストするのは難しいですが、私は次のようなものを使用しました:

SELECT bl.regn_id,
   RTRIM(LTRIM(dv.dv_id))   + '_' + RTRIM(LTRIM(bl.regn_id)) AS bu_regn,
   result.certified
FROM bl       
INNER JOIN
   (SELECT em.bl_id AS bl_id, COUNT (em.em_id) as certified
      FROM em 
      LEFT OUTER JOIN bl bl_s ON em.bl_id = bl_s.bl_id
      INNER JOIN irs_self_cert_em  ON  em.em_id = irs_self_cert_em.em_id 
               AND irs_self_cert_em.date_cert_loc >= DATEADD(month, -1, GETDATE())
     GROUP BY em.bl_id
     HAVING COUNT (em.em_id) > 0
    ) AS result ON result.bl_id = bl.bl_id
INNER JOIN em ON result.bl_id = em.bl_id 
         AND (em.date_last_update_cads >= 
     (SELECT date_last_update_completed FROM ddi_completed WHERE ddi_id='TRA_CADS_EM'))
CROSS JOIN dv ON dv.dv_id = em.dv_id      
WHERE bl.status = 'A'
于 2013-07-26T15:08:48.410 に答える
0
SELECT bl.regn_id,
   RTRIM(LTRIM(dv.dv_id))   + '_' + RTRIM(LTRIM(bl.regn_id)) AS bu_regn,
   S.certified
FROM bl       
    CROSS JOIN dv 
    CROSS APPLY (SELECT COUNT (em.em_id) as certified
      FROM em 
        LEFT OUTER JOIN bl bl_s ON em.bl_id = bl_s.bl_id
        LEFT OUTER JOIN irs_self_cert_em  ON  em.em_id = irs_self_cert_em.em_id
      WHERE dv.dv_id = em.dv_id
      AND bl.bl_id = bl_s.bl_id
      AND irs_self_cert_em.date_cert_loc >= DATEADD(month, -1, GETDATE())
      AND (em.date_last_update_cads >= (select date_last_update_completed FROM ddi_completed WHERE ddi_id='TRA_CADS_EM'))          
    ) AS S
    WHERE bl.status = 'A'  AND (S.certified > 0 )
于 2013-07-26T14:38:52.003 に答える