SQL SubQuery错误

时间:2014-03-03 11:13:02

标签: sql sql-server

我想检索以下示例中的数据。以下SQL将返回两条记录。

SELECT -1 AS NUM
FROM TABLE
WHERE COMP_CODE = 'TEST'
  AND (DETL_REMK = 'Rest Day'
       OR SHFT_CODE = 'WK_PH')
  AND RSRV_DATE_1 IS NOT NULL
  AND RSRV_DATE_1 BETWEEN @TR_FR AND @TR_TO
  AND EMPE_ID = 'TEST'
GROUP BY EMPE_ID,
         RSRV_DATE_1

我想在下面展示。

ORG UNIT          EMPE_ID        FAM_NAME       TMS_TYPE     Qty
-----------------------------------------------------------------
''                 ''              ''            Used         -1
''                 ''              ''            Used         -1

所以,我试图像SQL语句那样做。但我得到了错误 “子查询返回的值超过1。当子查询跟随=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。”

如何构建正确的SQL。请帮我。提前谢谢。

SELECT '' ORG_UNIT, '' EMPE_ID, '' FAM_NAME, 'Used' AS TMS_TYPE,
       ISNULL(CAST(
                  (SELECT -1 AS NUM
                   FROM TABLE
                   WHERE COMP_CODE = 'TEST'
                     AND (DETL_REMK = 'Rest Day'
                          OR SHFT_CODE = 'WK_PH')
                     AND RSRV_DATE_1 IS NOT NULL
                     AND RSRV_DATE_1 BETWEEN @TR_FR AND @TR_TO
                     AND EMPE_ID = 'TEST'
                   GROUP BY EMPE_ID, RSRV_DATE_1)AS NVARCHAR(MAX)),0) QTY

3 个答案:

答案 0 :(得分:4)

如果您只是对子查询外部的值进行硬编码,则不需要子查询来返回2行,只需执行此操作:

SELECT '' ORG_UNIT, '' EMPE_ID, '' FAM_NAME, 'Used' AS TMS_TYPE, -1 AS QTY
FROM TABLE
WHERE COMP_CODE = 'TEST'
  AND (DETL_REMK = 'Rest Day'
       OR SHFT_CODE = 'WK_PH')
  AND RSRV_DATE_1 IS NOT NULL
  AND RSRV_DATE_1 BETWEEN @TR_FR AND @TR_TO
  AND EMPE_ID = 'TEST'
GROUP BY EMPE_ID,
         RSRV_DATE_1

这里的问题是你没有引用表中的任何列,只是用它来产生一定数量的行。请分享完整的问题和代码,因为我相信你所要求的还有更多。

答案 1 :(得分:1)

你可以试试这个

SELECT '' ORG_UNIT, '' EMPE_ID, '' FAM_NAME, 'Used' AS TMS_TYPE, -1 as QTY
union all
SELECT '' ORG_UNIT, '' EMPE_ID, '' FAM_NAME, 'Used' AS TMS_TYPE, -1 as QTY

答案 2 :(得分:0)

您需要将 Top 1 添加到您的子查询中,从您收到的错误看起来,子查询返回的行数超过1行:

SELECT Top 1 -1 AS NUM
FROM TABLE
WHERE COMP_CODE = 'TEST'
AND (DETL_REMK = 'Rest Day',
OR SHFT_CODE = 'WK_PH')
AND RSRV_DATE_1 IS NOT NULL
AND RSRV_DATE_1 BETWEEN @TR_FR AND @TR_TO
AND EMPE_ID = 'TEST'
GROUP BY EMPE_ID, RSRV_DATE_1