2012-12-13 54 views
3

我試圖讓一個子查詢作爲一個條件列。SQLServer子查詢單元作爲列

我從SQL Server得到的錯誤是:

子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

還有一堆更多的列,我選擇,但這裏是給馬一個錯誤主查詢:

SELECT ItemNo, Channel, Brand, TotalUnits, 
     (SELECT TotalUnits FROM Table1 WHERE Locked = 1) As LockedUnits 
FROM Table1 

編輯:鎖定爲0或1的值

理想情況下,查詢將返回這個(LockedUnits總是TotalUnits的一個子集):

ItemNO Channel Brand TotalUnits LockedUnits 
1  5   Adidas 100   80 
2  7   Nike  500   360 
+0

我認爲你必須澄清你的問題。 –

回答

4

它看起來就像你正在試圖做的是隻對那些行,其中Locked = 1得到TotalUnits。如果是這樣的話,你最好不要使用case

SELECT ItemNo, Channel, Brand, TotalUnits, 
     case when Locked = 1 then TotalUnits else null end As LockedUnits 
FROM Table1 

您可以使用子選擇做到這一點,但你需要加入子選擇到主查詢。假設ItemNo是獨一無二的,它應該是這樣的:

SELECT ItemNo, Channel, Brand, TotalUnits, 
     (SELECT TotalUnits FROM Table1 t2 WHERE Locked = 1 
     WHERE t1.itemno = t2.itemno) As LockedUnits 
FROM Table1 t1 

當然,它是一種愚蠢的打一個表兩次獲得那些已經您傳回行中值。


評論迴應:只有你最好喜歡子選擇是,如果你從不同的表或不同列在同一個表中獲取數據。而且,即便如此,我還是希望將表放在where子句中並正常加入到主表中。

+0

你真棒,先生! 「case」選項對我來說更有意義,是否有任何情況下(雙關語不打算),哪個子選擇更適合? – yeenow123

1

嘗試把SELECT SUM(T otalUnits)

+0

我已經嘗試過了,它輸出每個行中所有項目的TotalUnits總和 – yeenow123

1

您必須將子查詢限制爲單個結果,否則無法將其返回到結果集列中。您需要通過SUM(TotalUnits),SELECT TOP 1或SELECT DISTINCT將結果縮小爲單個記錄。

+0

因此,條件「Locked = 1」對於每一行匹配不止一次? – yeenow123

+0

不,它每行匹配一次,但是如果你有多行匹配「locked = 1」,那麼它會將它們全部返回......除非你有其他限制它的東西。 – Ben

0
SELECT ItemNo, Channel, Brand, TotalUnits, 
    (SELECT sum(TotalUnits) FROM Table1 WHERE Locked = 1) As LockedUnits 
FROM Table1 
group by ItemNo, Channel, Brand, TotalUnits