Sql where中的语法不正确

Sql where中的语法不正确,sql,Sql,下面是我试图写的问题。但是我得到一个错误,在哪里附近说了不正确的语法 SELECT [p.ProjectId], SUM(pf.size), COUNT(pr.ServerGroupId) AS [UnRestrictedFacility], CASE WHEN COUNT(ps.CreatedBy) > 0 THEN 1 ELSE 0 END FROM Project p

下面是我试图写的问题。但是我得到一个错误,在哪里附近说了不正确的语法

SELECT
    [p.ProjectId],
    SUM(pf.size),
    COUNT(pr.ServerGroupId) AS [UnRestrictedFacility],
    CASE   
       WHEN COUNT(ps.CreatedBy) > 0 
          THEN 1 
          ELSE 0 
    END 
FROM
    Project p 
INNER JOIN
    ProjectFile pf 
INNER JOIN
    ProjectPartlink ppl ON pf.ProjectPartlinkId = ppl.ProjectPartlinkid  
                        AND ppl.ProjectId = p.projectid 
INNER JOIN
    ProjectRestriction pr ON pr.projectid = p.projectid 
INNER JOIN
    ProjectPreseed ps ON ps.projectid = p.projectid 
WHERE
    p.projectid = @projectid

有人能帮忙吗?

这个错误有点误导人:

From Project p inner join
   ProjectFile pf inner join
   ProjectPartlink ppl
您缺少第一次联接的

编辑:


您也在使用聚合函数,而不使用
分组依据
。据我所知,只有较旧版本的mysql才允许这样做。如果使用聚合,则必须使用
group by
子句来获得可靠的结果。您没有提到您使用的rdbms,但这也是导致错误的一个可能原因

错误有点误导:

From Project p inner join
   ProjectFile pf inner join
   ProjectPartlink ppl
您缺少第一次联接的

编辑:


您也在使用聚合函数,而不使用
分组依据
。据我所知,只有较旧版本的mysql才允许这样做。如果使用聚合,则必须使用
group by
子句来获得可靠的结果。您没有提到您使用的rdbms,但这也是导致错误的一个可能原因

以下是错误:

From Project p inner join
ProjectFile pf inner join
应该是

From Project p inner join
ProjectFile pf on p.id = pf.id inner join

这是一个错误:

From Project p inner join
ProjectFile pf inner join
应该是

From Project p inner join
ProjectFile pf on p.id = pf.id inner join

首先,从长远来看,清理并拥有一个格式良好的SQL将对您有所帮助。始终将你的“ON”子句与相应的连接放在一起,这样你就知道你没有忘记什么,并且在接下来的过程中得到了笛卡尔的结果。另外,我个人的偏好是始终使用leftSideAlias.column=rightSideAlias.column列出ON子句。它还有助于显示表A->B->C等之间的关系。。事实上,你已经拥有了所有的查询,我只是重新组织了它们。注意从一个表到下一个表的可读性

SELECT
      p.ProjectId,
      sum(pf.size),
      count(pr.ServerGroupId) UnRestrictedFacility,
      CASE when count(ps.CreatedBy) > 0 then 1 Else 0 END CreatedCounter
   From 
      Project p 
         inner join ProjectPartlink ppl  
            on p.projectid = ppl.ProjectId
            inner join ProjectFile pf 
               on ppl.ProjectPartlinkid = pf.ProjectPartlinkId
         inner join ProjectRestriction pr
            on p.projectid = pr.projectid
         inner join ProjectPreseed ps   
            on p.projectid = ps.projectid 
   where 
      p.projectid = @parmProjectid

最后是WHERE子句。您有@ProjectID,我知道它在提供变量时会引起混乱。如果没有使用该名称的变量,但有使用该名称的列,则它似乎解析为列名。为了避免这种情况,我喜欢明确地加上某种前缀,比如从@projectd到@parmprojectd的前缀,这样我知道它来自某个参数,而不是一个错误的列名引用。

首先,从长远来看,清理并拥有一个格式良好的SQL将对您有所帮助。始终将你的“ON”子句与相应的连接放在一起,这样你就知道你没有忘记什么,并且在接下来的过程中得到了笛卡尔的结果。另外,我个人的偏好是始终使用leftSideAlias.column=rightSideAlias.column列出ON子句。它还有助于显示表A->B->C等之间的关系。。事实上,你已经拥有了所有的查询,我只是重新组织了它们。注意从一个表到下一个表的可读性

SELECT
      p.ProjectId,
      sum(pf.size),
      count(pr.ServerGroupId) UnRestrictedFacility,
      CASE when count(ps.CreatedBy) > 0 then 1 Else 0 END CreatedCounter
   From 
      Project p 
         inner join ProjectPartlink ppl  
            on p.projectid = ppl.ProjectId
            inner join ProjectFile pf 
               on ppl.ProjectPartlinkid = pf.ProjectPartlinkId
         inner join ProjectRestriction pr
            on p.projectid = pr.projectid
         inner join ProjectPreseed ps   
            on p.projectid = ps.projectid 
   where 
      p.projectid = @parmProjectid

最后是WHERE子句。您有@ProjectID,我知道它在提供变量时会引起混乱。如果没有使用该名称的变量,但有使用该名称的列,则它似乎解析为列名。为了避免这种情况,我喜欢明确地加上某种前缀,比如从@ProjectID到@parmProjectID的前缀,这样我知道它来自某个参数,而不是错误的列名引用。

由于默认的操作顺序,这应该也能起作用

   From Project p 
   inner join ProjectFile pf 
   inner join ProjectPartlink ppl 
   on pf.ProjectPartlinkId=ppl.ProjectPartlinkid  
   on ppl.ProjectId=p.projectid 

由于默认的操作顺序,这也应该起作用

   From Project p 
   inner join ProjectFile pf 
   inner join ProjectPartlink ppl 
   on pf.ProjectPartlinkId=ppl.ProjectPartlinkid  
   on ppl.ProjectId=p.projectid 
你应该试试:

SELECT
    [p.ProjectId],
    SUM(pf.size),
    COUNT(pr.ServerGroupId) AS [UnRestrictedFacility],
    CASE   
       WHEN COUNT(ps.CreatedBy) > 0 
          THEN 1 
          ELSE 0 
    END 
FROM
    Project p 
INNER JOIN
    ProjectFile pf on pf.Id = p.tId
INNER JOIN
    ProjectPartlink ppl ON pf.ProjectPartlinkId = ppl.ProjectPartlinkid  
                        AND ppl.ProjectId = p.projectid 
INNER JOIN
    ProjectRestriction pr ON pr.projectid = p.projectid 
INNER JOIN
    ProjectPreseed ps ON ps.projectid = p.projectid 
WHERE
    p.projectid = @projectid
你应该试试:

SELECT
    [p.ProjectId],
    SUM(pf.size),
    COUNT(pr.ServerGroupId) AS [UnRestrictedFacility],
    CASE   
       WHEN COUNT(ps.CreatedBy) > 0 
          THEN 1 
          ELSE 0 
    END 
FROM
    Project p 
INNER JOIN
    ProjectFile pf on pf.Id = p.tId
INNER JOIN
    ProjectPartlink ppl ON pf.ProjectPartlinkId = ppl.ProjectPartlinkid  
                        AND ppl.ProjectId = p.projectid 
INNER JOIN
    ProjectRestriction pr ON pr.projectid = p.projectid 
INNER JOIN
    ProjectPreseed ps ON ps.projectid = p.projectid 
WHERE
    p.projectid = @projectid

[p].[ProjectId]
作为选择列表的第一项。您使用的是什么rdbms?除非是较旧版本的mysql,否则错误可能来自缺少的
group by
。即使您确实使用了一个rdbms,它允许聚合而不使用
分组依据
,您也应该添加它以获得可靠的结果。请查看我编辑的答案。将
[p].[ProjectId]
作为选择列表的第一项。您使用的是什么rdbms?除非是较旧版本的mysql,否则错误可能来自缺少的
group by
。即使您确实使用了一个rdbms,它允许聚合而不使用
分组依据
,您也应该添加它以获得可靠的结果。请看我编辑的答案。