Sql 在联接查询中使用计数(*)时出现SL错误

Sql 在联接查询中使用计数(*)时出现SL错误,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我试图在存储过程中使用下面的查询,从促销表和商家视图表中获取所有信息。但是我在关键字“from”附近得到了错误的语法。。这是在SQLServer2005中。我不知道如何才能解决这个问题。我做错了什么。谢谢你的帮助 SELECT *, (count(*) from Merchant_Views) FROM dbo.Promotion INNER JOIN dbo.Merchant_Location ON dbo.Promotion.LocationID = dbo.Merchant_Locatio

我试图在存储过程中使用下面的查询,从促销表和商家视图表中获取所有信息。但是我在关键字“from”附近得到了错误的语法。。这是在SQLServer2005中。我不知道如何才能解决这个问题。我做错了什么。谢谢你的帮助

SELECT *, (count(*) from Merchant_Views) FROM dbo.Promotion
INNER JOIN dbo.Merchant_Location ON dbo.Promotion.LocationID = dbo.Merchant_Location.LocationID
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = dbo.Promotion.LocationID
and dbo.Merchant_Views.ClickDate >= dbo.Promotion.startDate 
and dbo.Merchant_Views.ClickDate <=  dbo.Promotion.expireDate
and dbo.Merchant_Views.Status <> 'printed' 
WHERE dbo.Promotion.MerchantID=@MerchantID AND PostType=@PostType

谢谢

您只是缺少计数前选择*

SELECT *, ViewCnt
FROM dbo.Promotion p
     INNER JOIN dbo.Merchant_Location ml ON p.LocationID = ml.LocationID
     INNER JOIN dbo.Merchant_Views mv ON mv.LocationID = p.LocationID
     INNER JOIN 
     (SELECT p.ID, COUNT(*) AS ViewCnt
      FROM dbo.Promotion p
           INNER JOIN dbo.Merchant_Views mv ON mv.LocationID = p.LocationID
      GROUP BY p.Id) t ON t.ID = p.ID
WHERE p.MerchantID= @MerchantID AND PostType=@PostType
  AND MV.ClickDate >= p.startDate 
  AND MV.ClickDate <=  p.expireDate
  AND MV.Status <> 'printed' 

您只是缺少计数前选择*

SELECT *, ViewCnt
FROM dbo.Promotion p
     INNER JOIN dbo.Merchant_Location ml ON p.LocationID = ml.LocationID
     INNER JOIN dbo.Merchant_Views mv ON mv.LocationID = p.LocationID
     INNER JOIN 
     (SELECT p.ID, COUNT(*) AS ViewCnt
      FROM dbo.Promotion p
           INNER JOIN dbo.Merchant_Views mv ON mv.LocationID = p.LocationID
      GROUP BY p.Id) t ON t.ID = p.ID
WHERE p.MerchantID= @MerchantID AND PostType=@PostType
  AND MV.ClickDate >= p.startDate 
  AND MV.ClickDate <=  p.expireDate
  AND MV.Status <> 'printed' 

您需要对内部查询进行选择

SELECT *, (SELECT count(*) FROM Merchant_Views) FROM dbo.Promotion
...

您需要对内部查询进行选择

SELECT *, (SELECT count(*) FROM Merchant_Views) FROM dbo.Promotion
...

我想这是因为select中的这一条款

(count(*) from Merchant_Views)

我想这是因为select中的这一条款

(count(*) from Merchant_Views)

您的内部选择中缺少选择:

SELECT *, (SELECT count(*) from Merchant_Views) FROM dbo.Promotion
INNER JOIN dbo.Merchant_Location ON dbo.Promotion.LocationID = dbo.Merchant_Location.LocationID
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = dbo.Promotion.LocationID
and dbo.Merchant_Views.ClickDate >= dbo.Promotion.startDate 
and dbo.Merchant_Views.ClickDate <=  dbo.Promotion.expireDate
and dbo.Merchant_Views.Status <> 'printed' 
WHERE dbo.Promotion.MerchantID=@MerchantID AND PostType=@PostType

您的内部选择中缺少选择:

SELECT *, (SELECT count(*) from Merchant_Views) FROM dbo.Promotion
INNER JOIN dbo.Merchant_Location ON dbo.Promotion.LocationID = dbo.Merchant_Location.LocationID
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = dbo.Promotion.LocationID
and dbo.Merchant_Views.ClickDate >= dbo.Promotion.startDate 
and dbo.Merchant_Views.ClickDate <=  dbo.Promotion.expireDate
and dbo.Merchant_Views.Status <> 'printed' 
WHERE dbo.Promotion.MerchantID=@MerchantID AND PostType=@PostType
编辑

你在找这样的东西吗

SELECT count(P.PromotionID) AS COUNT  --,   MV.column1, mv.column2 --and so on..
FROM dbo.Promotion P
INNER JOIN dbo.Merchant_Location ML ON P.LocationID = ML.LocationID
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = P.LocationID
and MV.ClickDate >= P.startDate 
and MV.ClickDate <=  P.expireDate
and MV.Status <> 'printed' 
WHERE P.MerchantID=@MerchantID AND PostType=@PostType
--group by --  MV.column1, mv.column2 --and so on..
编辑

你在找这样的东西吗

SELECT count(P.PromotionID) AS COUNT  --,   MV.column1, mv.column2 --and so on..
FROM dbo.Promotion P
INNER JOIN dbo.Merchant_Location ML ON P.LocationID = ML.LocationID
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = P.LocationID
and MV.ClickDate >= P.startDate 
and MV.ClickDate <=  P.expireDate
and MV.Status <> 'printed' 
WHERE P.MerchantID=@MerchantID AND PostType=@PostType
--group by --  MV.column1, mv.column2 --and so on..

是的,您确实希望在此处使用具有聚合计数的group by

SELECT p.field,p.field2.p.field3,ml.f1,ml.f2,ml.f3,mv.f1,mv.f2,mv.f3, count(mv.*) FROM dbo.Promotion P
INNER JOIN dbo.Merchant_Location ML ON P.LocationID = ML.LocationID
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = P.LocationID
and MV.ClickDate >= P.startDate 
and MV.ClickDate <=  P.expireDate
and MV.Status <> 'printed' 
WHERE P.MerchantID=@MerchantID AND PostType=@PostType
group by p.field,p.field2.p.field3,ml.f1,ml.f2,ml.f3,mv.f1,mv.f2,mv.f3

是的,您确实希望在此处使用具有聚合计数的group by

SELECT p.field,p.field2.p.field3,ml.f1,ml.f2,ml.f3,mv.f1,mv.f2,mv.f3, count(mv.*) FROM dbo.Promotion P
INNER JOIN dbo.Merchant_Location ML ON P.LocationID = ML.LocationID
INNER JOIN dbo.Merchant_Views MV ON MV.LocationID = P.LocationID
and MV.ClickDate >= P.startDate 
and MV.ClickDate <=  P.expireDate
and MV.Status <> 'printed' 
WHERE P.MerchantID=@MerchantID AND PostType=@PostType
group by p.field,p.field2.p.field3,ml.f1,ml.f2,ml.f3,mv.f1,mv.f2,mv.f3


你提到的代码的COUNT*部分在哪里?我的错!!现在看看这个查询。非常感谢。那它该怎么办?到目前为止,我认为所有的答案都错了。想必你是在统计与某个促销活动相关的商家的观点,而不仅仅是统计所有的观点?你的桌子结构是什么?@MartinSmith你说得对。我试图获得每次促销的行数,而不是所有促销的行数。对不起,你提到的代码的COUNT*部分在哪里?我的错!!现在看看这个查询。非常感谢。那它该怎么办?到目前为止,我认为所有的答案都错了。想必你是在统计与某个促销活动相关的商家的观点,而不仅仅是统计所有的观点?你的桌子结构是什么?@MartinSmith你说得对。我试图获得每次促销的行数,而不是所有促销的行数。抱歉。无法绑定多部分标识符dbo.Merchant\u Views.ClickDate。这是我得到的新错误。我必须添加分组依据吗??非常感谢。可能是因为您使用的是别名dbo.Merchant_,而不知道您的表的完整数据结构,所以出现了thsi错误,我不知道是否可以帮助您修复该错误。听起来可能列名有误。@GarrettVlieger-否。这是因为内部联接dbo.Merchant\u Views MV为dbo.Merchant\u Views提供了一个别名,随后它被引用,因为它是无效的未关联名称。无法绑定多部分标识符dbo.Merchant\u Views.ClickDate。这是我得到的新错误。我必须添加分组依据吗??非常感谢。可能是因为您使用的是别名dbo.Merchant_,而不知道您的表的完整数据结构,所以出现了thsi错误,我不知道是否可以帮助您修复该错误。听起来可能列名有误。@GarrettVlieger-否。这是因为内部联接dbo.Merchant\u视图MV为dbo.Merchant\u视图提供了一个别名,随后它被引用,因为它是无效的未关联名称。@Ram您是否试图获取与促销相关的每个商户视图的计数?如果是这样,您需要指定列名而不是*,并且select会有所不同,您应该需要一些group BY,如果您想要count,我需要获取每个PromotionID的行数。很抱歉造成混淆,感谢您花时间纠正我…我想是的,我还需要从促销表以及Merchant_Views表中的促销ID计数中获取所有信息。好的,只需将它们添加到select和group by中,这就是为什么我刚才将它们添加为评论的第1栏、第2栏、第3栏等,我不知道你的表格的完整结构选择P.Column1,P.Column2,Mv.Column1,Mv.Column2。。。。。按P.Column1、P.Column2、Mv.Column1、Mv.Column2分组您可以这样做,但是当您没有任何count、max或任何agreegate函数时,在本例中您就有count。。因此,您需要显式指定列和分组方式。。在其他情况下,您可以使用,P.*,MV.*,但我不确定在这种情况下,select distinct*是否在所有情况下都有效。@Ram您是否正在尝试获取与促销相关的每个商户视图的计数?如果是这样,您需要指定列名而不是*,并且select会有所不同,您应该需要一些group BY,如果您想要count,我需要获取每个PromotionID的行数。很抱歉造成混淆,感谢您花时间纠正我…我想是的,我还需要从促销表以及Merchant_Views表中的促销ID计数中获取所有信息。好的,只需将它们添加到select和group by中,这就是为什么我刚才将它们添加为评论的第1栏、第2栏、第3栏等,我不知道你的表格的完整结构选择P.Column1,P.Column2,Mv.Column1,Mv.Column2。。。。。按P.Column1,P.Column2,Mv.Column1,Mv.Column2分组你可以这样做,但是当你在这个c中没有任何count,max或agreegate函数时
如果你在数数。。因此,您需要显式指定列和分组方式。。在其他情况下,您可以使用,P.*,MV.*,但我不确定在这种情况下,select distinct*是否在所有情况下都能工作..请厌倦group by的性能,所有联接都需要设置正确的索引。选择*是件坏事,尤其是在大桌子上。我只是警告你。你应该仔细检查你的执行计划。是的,我真的应该仔细看看。谢谢你的建议,Benner先生。如果你厌倦了团队的表现,那么所有的连接都需要设置正确的索引。选择*是件坏事,尤其是在大桌子上。我只是警告你。你应该仔细检查你的执行计划。是的,我真的应该仔细看看。谢谢你的建议,本纳先生。