我有这个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_]在表中多了一次,我不想要它。
我该如何解决?
答案 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
条款。 WHERE
和HAVING
之间的区别在于,WHERE
之前应用GROUP BY
,之后应用HAVING
。因此,要检查表中的条目是否只是一次,您可以将其分组并检查该组的行数是否为1.这就是上面所做的。
现在的问题是,当有多个行时,数据库无法决定要显示哪个行的组,因此规则是,当您应用GROUP BY
子句时,每个列都在必须在SELECT
子句中指定GROUP BY
子句,或者必须在该列上应用聚合函数。
因此,您必须调整SELECT
条款,SELECT * ...
仅GROUP BY
不起作用。
Ram建议使用DISTINCT
。这有点完全不同。当SELECT
子句的每一列对于多行相同时,它只显示一行。它不会过滤行,有多次,它只显示一次。没有检查。
P.S。:请确保清理您的输入以进行查询。我不是程序员,但您的查询肯定对此'" & request.form("from") & "'
感到怀疑。阅读有关SQL注入攻击的信息......
另一个建议是...你可以使用别名来表名,使你的查询看起来更漂亮,输入更少。