SQL查询返回多行

时间:2017-11-07 02:16:14

标签: sql sql-server

我编写了一个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
) 

2 个答案:

答案 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_NOCONT_NO是指DRTS.CONT_NO。它应该是与外部查询的相关性。