Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套SQL语句中出现错误_Sql_Sql Server - Fatal编程技术网

嵌套SQL语句中出现错误

嵌套SQL语句中出现错误,sql,sql-server,Sql,Sql Server,有人能帮我修复这个SQL语句吗?我有两张桌子。。。尝试获取表1(c)中所有记录的列表以及表2中匹配记录的计数(如果有)(cp_文档) 谢谢, Tracy您只需向SELECT子句添加一个子查询即可。这比加入临时工作台更干净。如果您试图读取其他人的查询以了解计算是如何完成的,那么将从SELECT语句开始。如果select语句指向表别名(例如cp_docs),则需要在FROM子句中查找该表。。。执行计划几乎相同;建议的SELECT子句子查询实际上消除了一个无害的计算定标器步骤 SELECT c.cal

有人能帮我修复这个SQL语句吗?我有两张桌子。。。尝试获取表1(c)中所有记录的列表以及表2中匹配记录的计数(如果有)(cp_文档)

谢谢,
Tracy

您只需向SELECT子句添加一个子查询即可。这比加入临时工作台更干净。如果您试图读取其他人的查询以了解计算是如何完成的,那么将从SELECT语句开始。如果select语句指向表别名(例如cp_docs),则需要在FROM子句中查找该表。。。执行计划几乎相同;建议的SELECT子句子查询实际上消除了一个无害的计算定标器步骤

SELECT c.cal_procedure ,           
c.description ,           
c.active ,           
c.create_user ,           
c.create_date ,           
c.edit_user ,           
c.edit_date ,           
c.id,
(SELECT COUNT(*) FROM cal_procedure_docs where cal_procedure = c.cal_procedure) AS cpd
FROM cal_procedure c

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

  • OUTER在OUTTER处写得不正确
  • 您的外部关键字需要以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。如果您想使用当前的方法,但显示的是zero,则需要将cp_docs.cpd包装在合并函数中

    coalesce(cp_docs.cpd, 0)
    

    最后,我认为Max的答案更容易阅读,可能也是我写这个查询的方式,因为我认为它更容易阅读。如果表很大,您可能需要检查每个表的性能,以查看其中一个表优于另一个表。

    也许您需要
    外部应用

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

    如果您包含错误消息并标记适当的RDBMS,这将非常有用。
    OUTTER-JOIN
    。您拼错了“OUTER”,并且没有指定联接是左外联接、右外联接还是完全外联接。
    选择TOP 100
    将只返回100行,您应该使用
    选择TOP 100%
    ,或者将
    TOP 100
    一起删除。谢谢@darryls995!非常感谢!非常感谢您这么快的回复!拼写当然重要!我将使用Max的解决方案,但您的解决方案肯定也有效。这更符合原始查询的精神。这是另一个伟大的想法!感谢您花时间回复。
    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 ? ? ? ;