實例查詢:我應該使用頂部(1)在一個子查詢
select *
from A join B on A.ID = B.SOMEVALUE
where A.VALUE="something" and
B.ID =
(select ID from B where SOMEVALUE = A.ID and
THISDATE = (select max(SOMEDATE) from B where ...))
所以,如果你可以閱讀SQL你應該看到我做一對夫婦的相關子查詢縮小的連接的結果。 (是的,這是可怕的過度簡化)。
在某些情況下,子查詢:
select ID from B where SOMEVALUE = A.ID and
THISDATE = (select max(SOMEDATE) from B where ...)
可以返回多個值,這將導致
「子查詢返回多個值 這是不允許的錯誤,當 子查詢遵循=,!=,<,< =,>,> = 或子查詢用作 表達式時。
我完全期待。這顯然不是一個好東西,我在地方的代碼(希望)防止這些重複從進入數據庫擺在首位(即表B中應該只有該
SOMEVALUE = A.ID and max(SOMEDATE)
匹配1排標準),但最終用戶如果沒有創造力去尋找我想不到打破軟件的方式,則什麼都不是。
所以現在我的問題:
它會更好,以第一子查詢更改爲
select top 1 * from B ...
,以防止用戶看到一個錯誤,如果(但願永遠)出現這種情況時/或讓錯誤通過。我傾向於不添加頂部語句並讓錯誤通過,而讓用戶看到可能不正確的數據。我想知道是否有人在這種情況下對最佳實踐有任何想法......
這也正是同樣的事情,加入TOP 1.這只是一種不同的味道的SQL(MySQL和等) – 2009-01-30 16:21:19
同意邁克爾,這是一個不同的風味所以限制1可能不會在這句法實際工作。 – Kezzer 2009-01-30 16:22:26
不回答這個問題,但它確實澄清了問題對於那些不熟悉TOP 1語法的人所暗示的問題。 – 2009-01-30 16:33:34