2012-12-22 72 views
0
SELECT [SKULL].[dbo].[reports].[idnumber], [SKULL].[dbo].[reports].[subid] 
FROM [SKULL].[dbo].[reports] 
WHERE reportColumn = (SELECT DISTINCT(reportColumn) 
         FROM [SKULL].[dbo].[reports] 
         WHERE [SKULL].[dbo].reports.reportColumn 
         LIKE '%someword%') 

我得到一個錯誤信息說如何在SQL Server 2012中運行子查詢?

Msg 512, Level 16, State 1, Line 2 
Subquery returned more than 1 value. 
This is not permitted when the subquery follows =, !=, <, <= , >, >= or 
when the subquery is used as an expression. 

感謝。

+1

我建議你閱讀錯誤信息,因爲它告訴你發生了什麼事。當子查詢返回多行時,您的查詢仍然有意義嗎? – usr

回答

1

如果子查詢返回不止一行,然後使用IN,而不是作爲=

SELECT [SKULL].[dbo].[reports].[idnumber], [SKULL].[dbo].[reports].[subid] 
FROM [SKULL].[dbo].[reports] 
WHERE reportColumn IN (SELECT DISTINCT(reportColumn) 
         FROM [SKULL].[dbo].[reports] 
         WHERE [SKULL].[dbo].reports.reportColumn 
         LIKE '%someword%') 

OR

如果烏拉圭回合確定的子查詢

返回單行然後用

SELECT [SKULL].[dbo].[reports].[idnumber], [SKULL].[dbo].[reports].[subid] 
FROM [SKULL].[dbo].[reports] 
WHERE reportColumn = (SELECT top(1) DISTINCT(reportColumn) 
         FROM [SKULL].[dbo].[reports] 
         WHERE [SKULL].[dbo].reports.reportColumn 
         LIKE '%someword%' order by idnumber) 
+3

你永遠不應該使用頂部(1)沒有訂單,特別是在這樣的情況下。沒有訂單的頂部(1)可能會在每次執行時返回不同的行。 –

+0

此外,只有當實際遇到多個行時纔會發生此錯誤,因此我們可以確定子查詢不會只返回一行。 –

+0

對不起,我的錯誤.... –

0

你在做where field=subquery,這是一個平等測試 - 子查詢MUSt返回一個單值值,例如1行1值。現在2行,而不是2個字段。如果你要返回多行,它必須是where field IN (subquery)

0

由於錯誤狀態,您的子查詢只能返回單個記錄。嘗試使用TOP 1來做到這一點。

SELECT [SKULL].[dbo].[reports].[idnumber], [SKULL].[dbo].[reports].[subid] FROM [SKULL].[dbo].[reports] WHERE reportColumn = (SELECT TOP 1 reportColumn 
    FROM [SKULL].[dbo].[reports] WHERE [SKULL].[dbo].reports.reportColumn LIKE '%someword%') 
+0

你不應該使用頂部(1)沒有訂單,特別是在這種情況下。沒有訂單的頂部(1)可能會在每次執行時返回不同的行。 –

0

錯誤原因:嘗試將單個值與多個值進行比較。

解決方案:或者限制內部查詢返回1值或更改where條件以與多個返回集進行比較。

比較單值: SELECT [顱骨] [DBO] [報告] [IDNumber中],[頭骨] [DBO] [報告] [子ID] FROM [顱骨] [DBO。。。。 ] [報告] WHERE reportColumn =(SELECT TOP1 reportColumn FROM [顱骨] [DBO]。[報告] WHERE [顱骨] [DBO] .reports.reportColumn LIKE '%someword%')

OR

多回報比較設置

SELECT [骷髏] [DBO]。[報告]。[IDNumber中],[頭骨]。[DBO ] [報告] [subid] FROM [SKULL]。[dbo]。[reports] WHERE reportColumn in(SELECT DISTINCT(reportColumn) FROM [SKULL]。[dbo]。[reports] WHERE [SKULL] [DBO] .reports.reportColumn LIKE '%someword%')

2

我不太確定你在這裏做什麼。如果我們假設您想要返回報告列與報表列中所有包含相同單詞的不同列表相匹配的所有報告記錄,則您的工作量過大。你可以這樣寫:

SELECT [SKULL].[dbo].[reports].[idnumber], [SKULL].[dbo].[reports].[subid] 
FROM [SKULL].[dbo].[reports] 
WHERE reportColumn LIKE '%someword%'; 

如果這不是你想要的,請檢查您的查詢,特別是列名和表名是什麼。如果在這種情況下仍然無法確定如何編寫查詢,請發佈一些示例值和預期結果。

相關問題