如果一个子查询的结果大于另一个子查询的结果,如何插入

时间:2017-07-03 10:04:41

标签: sql sql-server

我有一个包含PR列的表DMZ。此列只能取值1或2.并且我想在DMZ中插入新行,如果PR = 1的行数大于PR的行数,则PR将为2,如果数量为(=) 2)比(pr = 1)更好,然后插入1。

我怎么能意识到这个问题?

我写了这样的查询,但我有一个错误。

错误:

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。   声明已经终止。

提前谢谢。

INSERT INTO DMZ (NDM, DDM, PR) VALUES 
((select MAX(NDM)+1 from DMZ), GETDATE(), 
(Select 
(case when 
(select Count(PR) from DMZ where PR='2') >
(select Count(PR) from DMZ where PR='1') then 1
 else 2 End)
 from DMZ))

2 个答案:

答案 0 :(得分:2)

您有不必要的子查询,不需要VALUES关键字,只需使用INSERT..SELECT

INSERT INTO dmz (NDM, DDM, PR) 
SELECT MAX(NDM)+1, GETDATE()
, CASE WHEN 
(select Count(PR) from DMZ where PR='2') >
(select Count(PR) from DMZ where PR='1') then 1
 ELSE 2 End
FROM DMZ 

答案 1 :(得分:1)

我发现那些嵌套的子查询过于复杂。怎么样?

INSERT INTO DMZ (NDM, DDM, PR) 
    select MAX(NDM) + 1, GETDATE(), 
           (case when sum(case when PR = 2 then 1
                               when PR = 1 then -1
                               else 0
                          end) > 0
                 then 1 else 2
            end) as PR
   from DMZ;

我从PR的比较中删除了单引号。它似乎是一个数字。你不应该比较数字和字符串。保持类型一致。

此外,使用max(ndm) + 1表示您可能真的想要使用identity列。