3

我正在尝试将子查询作为具有条件的列。

我从 SQL Server 得到的错误是:

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

我正在选择更多列,但这是给 ma 一个错误的主要查询:

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
4

4 回答 4

8

看起来您要做的只是TotalUnits获取Locked = 1. 如果是这种情况,你最好使用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 子句中,并正常将其加入主表。

于 2012-12-13T23:07:23.277 回答
1

尝试将 SELECT sum(TotalUnits) 放入子查询中

于 2012-12-13T22:56:59.927 回答
1

您必须将子查询限制为单个结果,否则无法在结果集列中返回。您需要通过 SUM(TotalUnits)、SELECT TOP 1 或 SELECT DISTINCT 将结果缩小到单个记录。

于 2012-12-13T22:59:24.293 回答
0
SELECT ItemNo, Channel, Brand, TotalUnits,
   (SELECT sum(TotalUnits) FROM Table1 WHERE Locked = 1) As LockedUnits
FROM Table1
group by ItemNo, Channel, Brand, TotalUnits
于 2012-12-13T23:03:28.913 回答