2016-08-11 94 views
2

我遇到了一个子查询问题,希望有人可以帮助我。SQL子查询超过1个值

如果我运行以下命令:

select t4.code from OITM T0 
INNER JOIN DLN1 T1 ON T1.[ItemCode] = T0.[ItemCode] 
INNER JOIN ODLN T2 ON T2.[DocEntry] = T1.[DocEntry] 
INNER JOIN ITM10 T3 ON T3.[ItemCode] = T0.[ItemCode] 
LEFT JOIN ODCI T4 ON T4.[AbsEntry] = T3.[ISCommCode] 
WHERE T2.DocEntry = '7060' 

结果是:

虽然在某些情况下可能存在的值相匹配的所需的多行和其他人在做不同时。

我写它有一个子查询核对这些结果,并显示一条消息,如果在任一行和[code]列不包含一些特定的查询:

IF(
(SELECT 
    T4.Code 
FROM OITM T0 
INNER JOIN DLN1 T1 ON T1.[ItemCode] = T0.[ItemCode] 
INNER JOIN ODLN T2 ON T2.[DocEntry] = T1.[DocEntry] 
INNER JOIN ITM10 T3 ON T3.[ItemCode] = T0.[ItemCode] 
LEFT JOIN ODCI T4 ON T4.[AbsEntry] = T3.[ISCommCode] 
WHERE T2.DocEntry = '7060') NOT IN ('22030010','22030001','22030009') 
) 
BEGIN 
SELECT 'MESSAGE' 
END 

显然,这将无法编译如果它有返回超过1行:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

HAVING和他们编译不显示这显然是错误的消息计数不工作。

这是可能的还是我吠叫错了树?

非常感谢。

+1

如何只增加一个'where'子句来查询? –

回答

1

因为如果有这样的行检查,你可以使用EXISTS

IF EXISTS (SELECT ...) 

在你的情况我会做出选择distinct返回一个特定的值只有一次:

select DISTINCT t4.code from OITM T0 ... 

UPDATE

由于@gordon-linoff指出,你可以过滤出th Ë不需要的值是这样的:

select distinct t4.code from OITM T0 
... 
where T2.DocEntry = '7060' and t4.code not in ('22030010','22030001','22030009') 
-- using AND instead of): ^^^ 
-- so one (will be enough between EXISTS and SELECT 

将其组合在一起:

IF EXISTS(SELECT .... where T2.DocEntry = '7060' and t4.code not in ('22030010','22030001','22030009')) 
BEGIN 
    ... 
END 
+0

感谢您的帮助。你能帮我按照EXISTS的语法吗?当我使用IF EXISTS(...) – coblenski

+1

唉,它给NOT IN语法错误,也许这是@ gordon-linoff的意思。这是如何使子查询正常运行:'SELECT T4.Code ... WHERE T2.DocEntry ='7060'AND T4.code NOT IN('22030010','22030001','22030009')'。添加更新到帖子。 –

+0

我不认为这有效。它编译但不显示消息。 – coblenski

相关问题