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,它允许聚合而不使用分组依据
,您也应该添加它以获得可靠的结果。请看我编辑的答案。