只有当表1中的col时

时间:2013-12-09 12:44:45

标签: mysql

我有这个SQL

SELECT * FROM dbo.[3S Company A_S$Posted Invt_ Put-away Header] 
INNER JOIN dbo.[3S Company A_S$Posted Invt_ Put-away Line] ON dbo.[3S Company A_S$Posted Invt_ Put-away Header].No_ = dbo.[3S Company A_S$Posted Invt_ Put-away Line].No_ 
WHERE ([Posting Date] > '" & request.form("from") & "' AND [Posting Date] < '" & request.form("to") & "')

它就像魅力一样。但我的输出不正确。

我只想要我的输出,如果dbo。[3S公司A_S $发布Invt_ Put-away Line]。[Item No_]在表1中。如果[item no_]在表中多了一次,我不想要它。

我该如何解决?

2 个答案:

答案 0 :(得分:0)

如果它是您要显示的唯一列,则可以使用DISTINCT关键字。但是您正在使用*(显示整组列)。 SQL仅将行视为单个实体。因此,如果任何列值存在任何差异,即使您使用DISTINCT

,整个行也会再次显示

答案 1 :(得分:0)

首先,这不是MySQL。我猜是SQL Server?请在将来使用相应的标记标记您的问题。

要回答您的问题,您必须添加

GROUP BY dbo.[3S Company A_S$Posted Invt_ Put-away Line].[Item No_]
HAVING COUNT(*) = 1

简短说明:您可以在查询中使用聚合函数,例如SELECT MAX(price) FROM whatever;。这样的查询总是返回一行,即具有最高价格的行。您可以添加GROUP BY以获得每个经销商的最高价格,如下所示:SELECT dealer, MAX(price) FROM whatever GROUP BY dealer;当您的表中有多个经销商时,您会获得更多行。现在,您可以拥有HAVING条款。 WHEREHAVING之间的区别在于,WHERE之前应用GROUP BY,之后应用HAVING。因此,要检查表中的条目是否只是一次,您可以将其分组并检查该组的行数是否为1.这就是上面所做的。

现在的问题是,当有多个行时,数据库无法决定要显示哪个行的组,因此规则是,当您应用GROUP BY子句时,每个列都在必须在SELECT子句中指定GROUP BY子句,或者必须在该列上应用聚合函数。

因此,您必须调整SELECT条款,SELECT * ...GROUP BY不起作用。

Ram建议使用DISTINCT。这有点完全不同。当SELECT子句的每一列对于多行相同时,它只显示一行。它不会过滤行,有多次,它只显示一次。没有检查。

P.S。:请确保清理您的输入以进行查询。我不是程序员,但您的查询肯定对此'" & request.form("from") & "'感到怀疑。阅读有关SQL注入攻击的信息......
另一个建议是...你可以使用别名来表名,使你的查询看起来更漂亮,输入更少。