2013-12-09 44 views
-1

我有這樣的SQL只有山坳表1時間

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_保存行]。[Item No_]在表1中。如果[item no_]更多一次在表格中,我不需要它。

我該如何解決這個問題?

+0

嘗試使用count(變量)if(count = 1)display ..在查詢中實現它 – sam

回答

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之間的區別在於,在GROUP BYHAVING之後應用WHERE。因此,要檢查一個條目是否只是表中的一次,可以對它進行分組,並檢查該組的行數是否爲1.這就是上面所做的。

現在的問題是,數據庫無法決定顯示哪組行時,如果存在多個,則規則是,當您應用GROUP BY子句時,SELECT子句中的每列必須在GROUP BY子句中指定,或者必須在該列上應用聚合函數。

所以你將不得不調整你的SELECT條款,只需SELECT * ...GROUP BY不起作用。

Ram建議使用DISTINCT。這做了完全不同的事情。它僅顯示一行,當SELECT子句的每一列對於多行都是相同的。它不會過濾那些有多次的行,只會顯示一次。沒有涉及檢查。

P.S .:請確保清理您的輸入查詢。我不是程序員,但你的查詢確實看起來與這'" & request.form("from") & "'可疑。閱讀有關SQL注入攻擊的信息...
另一個建議...您可以使用表名的別名,使查詢看起來更漂亮,輸入的次數也更少。

0

如果它是唯一想要顯示的列,那麼可以使用DISTINCT關鍵字。但是你正在使用*(顯示整組列)。 SQL僅將行視爲單個實體。因此,如果任何列值存在差異,即使您使用DISTINCT