有人可以帮助我修复此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
谢谢, 特雷西
答案 0 :(得分:2)
很难说没有错误消息,但是您的外部联接有几个问题。
固定的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 ? ? ? ;