我编写了一个SQL查询,如果一个合约的产品类型超过1,则从列返回值。
当我将此查询用于我的主查询时,我收到此错误:
单行子查询返回多行
当我使用rownum = 1
时,不会返回任何行。
我需要返回合约的类型
(SELECT
MAX(TYPE) AS TYPE,
CONT_NO
FROM
(SELECT
MO.CONT_NO,
MO.TYPE,
COUNT (*) C1
FROM
TABLE1.MORG MO
GROUP BY
MO.CONT_NO, MO.TYPE) DRT1
WHERE
DRT1.CONT_NO = CONT_NO
GROUP BY
CONT_NO
HAVING
COUNT (*) = 1 AND SUM (C1) > 1
)
答案 0 :(得分:0)
可能有几种方法可以解决您的问题,但您没有透露太多细节。
IF 您将在select clause
中包含该子查询,它最有可能需要"相关"到当前结果集的某个值。 e.g。
SELECT
...
(SELECT
MAX(TYPE) AS type
FROM (
SELECT
mo.TYPE
, COUNT(*) c1
FROM TABLE1.MORG mo
WHERE mo.CONT_NO = XYZ.CONT_NO --<<<< a "correlation" to the outer query
GROUP BY
mo.TYPE
) drt1
WHERE drt1.CONT_NO = CONT_NO --<<<< is this a "correlation" to the outer query?
HAVING SUM(C1) > 1)
FROM XYZ
....
这是因为您不允许在&#34;单元格中返回多行&#34;所选行的结果,因此您需要将结果限制为单值。
在SQL Server中,一种非常有用的替代&#34;相关子查询的技术&#34;是使用OUTER APPLY(或CROSS APPLY),但看起来这个子查询可以(应该?)用作连接的派生表。
SELECT
...
, x.type
FROM XYZ t
LEFT JOIN (
SELECT
MAX(TYPE) AS type
, CONT_NO
FROM (
SELECT
mo.CONT_NO
, mo.TYPE
, COUNT(*) c1
FROM TABLE1.MORG mo
GROUP BY
mo.CONT_NO
, mo.TYPE
) drt1
WHERE drt1.CONT_NO = CONT_NO
GROUP BY
CONT_NO
HAVING COUNT(*) = 1
AND SUM(C1) > 1
) x ON t.cont_no = x.cont_no
答案 1 :(得分:0)
如果这是SQL Server,您可能需要:
(SELECT TOP 1 MAX(TYPE) AS TYPE,
FROM (SELECT MO.CONT_NO, MO.TYPE, COUNT(*) C1
FROM TABLE1.MORG MO
GROUP BY MO.CONT_NO, MO.TYPE
) DRT1
WHERE DRT1.CONT_NO = <external reference>.CONT_NO
GROUP BY CONT_NO
HAVING COUNT (*) = 1 ANDSUM (C1) > 1
)
也许最大的问题是WHERE DRT1.CONT_NO = CONT_NO
。 CONT_NO
是指DRTS.CONT_NO
。它应该是与外部查询的相关性。