嵌套SQL语句中的错误

时间:2018-07-19 15:33:58

标签: sql sql-server

有人可以帮助我修复此SQL语句吗?我有2个表...试图获取表1(c)中所有记录的列表以及表2(cp_docs)中匹配记录的计数(如果有)。

SELECT TOP 100 c.cal_procedure ,           
c.description ,           
c.active ,           
c.create_user ,           
c.create_date ,           
c.edit_user ,           
c.edit_date ,           
c.id,
cp_docs.cpd     
FROM cal_procedure c
OUTTER JOIN  (select cal_procedure as cp, count(id) as cpd
from cal_procedure_doc
group by cal_procedure) cp_docs
ON cp_docs.cp = c.cal_procedure

谢谢, 特雷西

3 个答案:

答案 0 :(得分:2)

很难说没有错误消息,但是您的外部联接有几个问题。

  1. OUTER错误地写在OUTTER
  2. 您的OUTER关键字必须以LEFT或RIGHT开头。根据查询中的逻辑,您可能希望向左移

固定的SQL:

SELECT TOP 100 c.cal_procedure ,           
    c.description ,           
    c.active ,           
    c.create_user ,           
    c.create_date ,           
    c.edit_user ,           
    c.edit_date ,           
    c.id,
    cp_docs.cpd     
    FROM cal_procedure c
    LEFT OUTER JOIN  (select cal_procedure as cp, count(id) as cpd
    from cal_procedure_doc
    group by cal_procedure) cp_docs
    ON cp_docs.cp = c.cal_procedure

现在,在您的查询中,如果cal_prodcedure_doc表中没有值,则可以在cpd列中获得空值。如果您看一下Max的答案,您将得到0。如果要使用当前方法但显示为零,则需要将cp_docs.cpd包装在合并函数中

coalesce(cp_docs.cpd, 0)

最后,我认为Max的答案更容易阅读,可能是我认为更容易阅读的方式来编写此查询。如果表很大,您可能需要检查每个表的性能如何,以查看一个表比另一个表更好。

答案 1 :(得分:1)

您可以只将子查询添加到SELECT子句中。比加入临时表干净。如果您尝试读取其他人的查询以弄清楚如何完成计算,则将从SELECT语句开始。如果select语句将您指向表别名(例如cp_docs),则需要在FROM子句中找到该表...等等。执行计划几乎是相同的。提议的SELECT子查询实际上消除了一个无害的Compute Scaler步骤。

i

答案 2 :(得分:0)

也许您想要outer apply

SELECT TOP 100 c.cal_procedure, c.description, c.active, c.create_user,           
       c.create_date, c.edit_user, c.edit_date, c.id, cp_docs.cpd     
FROM cal_procedure c OUTER APPLY  
     (select count(id) as cpd
      from cal_procedure_doc
      where cal_procedure = c.cal_procedure
     ) cp_docs
ORDER BY ? ? ? ;