2013-07-26 87 views
1

下面是一段SQL代码不起作用:如何使用SELECT ...如在WHERE子句

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数据库错误:无效的列名称'认证'。“

正如你所看到的,我在SELECT语句中使用了一个子查询,并给它起了'认证'这个名字。然后我尝试在WHERE子句中使用该值。

有人可以建议和替代方法来完成这个?

非常感谢, 马特

+0

您不能在'WHERE'子句中使用别名列。我会创建另一个子查询来为该字段添加标准。 – JoeFletch

+1

您将不得不再次包含整个SELECT –

+1

您无法在条件中使用列别名。 –

回答

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 JOININNER JOIN s会更有效/更快地工作)。检查出来,让我知道这是否符合您的预期。而不必表结构

;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 
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) 
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'