2017-09-27 318 views
1

我的問題是:
我不斷地返回多個值,當我不期望。我試圖獲得由州,縣和國家決定的特定氣候。SQL - 子查詢返回多個值

我試過的東西:
下面給出的代碼。我不確定具體是什麼問題。我知道它返回多個值。但爲什麼?我指定STATE_ABBREVIATION = PROV_TERR_STATE_LOC和我做的inner join,不應該創建除了它們的不同CLIMATE_ID以外相似的行嗎?

SELECT 
...<code>... 
    (SELECT locations.CLIMATE_ID 
     FROM REF_CLIMATE_LOCATION locations, SED_BANK_TST.dbo.STATIONS stations 
     INNER JOIN REF_STATE states ON STATE_ID = states.STATE_ID 
     INNER JOIN REF_COUNTY counties ON COUNTY_ID = counties.COUNTY_ID 
     INNER JOIN REF_COUNTRY countries ON COUNTRY_ID = countries.COUNTRY_ID 
     WHERE STATE_ABBREVIATION = PROV_TERR_STATE_LOC) AS CLIMATE_ID 
...<more code>... 
FROM SED_BANK_TST.dbo.STATIONS stations 

我已經在這幾個小時,查找上如此不同的問題,但我不能想出如何使這個子查詢返回一個值。

+2

如果沒有示例數據和可能的全表模式,我們將無法做到這一點。有各種方法可以使查詢返回單個值,但無法確定正確的方法。 – squillman

+0

如果您正在測試的ID存在於REF表中,則所有這些內連接都不會減少結果集。 – Ronald

回答

1

如果您正在測試的ID存在於REF表中,那麼所有這些內連接都不會減少結果集。除此之外,你正在做位置和站點之間的笛卡爾產品(由於where子句,這可能是一個老式的內連接)。

你只能得到一個單一行,如果你只需要在位置表是STATE_ABBREVIATION = PROV_TERR_STATE_LOC

0

你的JOIN顯示的位置層次結構的情況下匹配在站表中的一行單行:國家 - >州 - >縣,但您的WHERE子句僅限於州名縮寫。通過加入該縣,您將獲得該州每個縣的一個記錄。你可以通過獲得結果中的第一名來限制你的結果,但是你需要非常小心,這真的是你想要的。如果你正在尋找一個特定的縣,你需要將它包含在WHERE子句中。你可以通過TOP 1來控制它,它會根據ORDER BY子句給出top 1。也就是說,如果你想最近添加的,使用:

SELECT TOP 1 [whatever] ORDER BY [DateCreated] DESC; 

爲了您的子查詢,你可以做這樣的事情:

SELECT TOP 1 
    locations.CLIMATE_ID 
FROM REF_CLIMATE_LOCATION locations , 
     SED_BANK_TST.dbo.STATIONS stations 
     INNER JOIN REF_STATE states ON STATE_ID = states.STATE_ID 
     INNER JOIN REF_COUNTY counties ON COUNTY_ID = counties.COUNTY_ID 
     INNER JOIN REF_COUNTRY countries ON COUNTRY_ID = countries.COUNTRY_ID 
WHERE STATE_ABBREVIATION = PROV_TERR_STATE_LOC 

只要確保無論是在末尾添加一個命令或可以根據桌上的「自然順序」選擇TOP 1。

0

如果您希望在您的子查詢中擁有單個值,那麼可能需要使用DISTINCT。查看它的最好方法是分別運行子查詢並查看結果。如果您需要包含您使用的表中的其他列,您可以這樣做來檢查結果是否有多行。

您還可以使用MAX()MIN()TOP 1以取得該子查詢一個值,但這取決於你想要達到locations.CLIMATE_ID邏輯。你需要回答這個問題:「它與檢索到的其他列有什麼關係?」