【问题标题】:Insert new row for binary systems with SQL使用 SQL 为二进制系统插入新行
【发布时间】:2016-10-16 22:48:23
【问题描述】:

我有下表

 (cl1  ,  cl2)
  ----  ----
  (a   ,  1)
  (a   ,  2)
  (b   ,  2)
  (c   ,  1)
  (c   ,  2)

每个 a , b ,c 可以取两个值(1 或 2 或两者)。

我的问题是:
如何为示例中只有 1 或 2 而不是两者的所有 cl1 插入新行(cl2 上为 0)。我想插入以下行:

----
(b   ,  0)
----

【问题讨论】:

  • 这是什么数据库? MySQL 还是甲骨文?您有冲突的标签。
  • 您能否提供更多有关您的问题的信息?你用的是什么数据库?你还有代码吗?如果有,你能提供吗?有错误信息吗?
  • 谢谢,它有效

标签: mysql sql plsql oracle11g


【解决方案1】:

我确信有更好的方法,但这里有一种方法可以使用 group by 和 having 子句来强制执行您的规则(我假设是 Oracle 语法):

insert into tbl (cl1, cl2)
(select cl1, 0
   from tbl
  group by cl1
 having count(case when cl2 in (1, 2) then 'X' end) != 0 -- contains 1 or 2
    and (count(case when cl2 = 1 then 'X' end) = 0 -- but not both
         or count(case when cl2 = 2 then 'X' end) = 0)
)

编辑

更简单的方法:

insert into tbl (cl1, cl2)
(select cl1, 0
   from tbl
  where cl2 in (1, 2)
  group by cl1
 having count(distinct cl2) = 1
)

【讨论】:

    【解决方案2】:

    我假设 BD 是 Oracle。希望下面的 sn-p 有所帮助。

    SELECT B.CL1,
      0
    FROM
      (SELECT A.CL1,
        CASE
          WHEN WMSYS.WM_CONCAT(A.CL2) LIKE '%1%'
          AND WMSYS.WM_CONCAT(A.CL2) LIKE '%2%'
          THEN 'both'
          ELSE 'one'
        END rnk
      FROM
        (SELECT 'a' cl1,1 cl2 FROM dual
        UNION ALL
        SELECT 'a' cl1,2 cl2 FROM dual
        UNION ALL
        SELECT 'b' cl1,2 cl2 FROM dual
        UNION ALL
        SELECT 'c' cl1,1 cl2 FROM dual
        UNION ALL
        SELECT 'c' cl1,2 cl2 FROM dual
        )A
      GROUP BY A.CL1
      )B
    WHERE B.rnk = 'one';
    

    【讨论】:

      【解决方案3】:
      CREATE TABLE TestTable (cl1 VARCHAR(2), cl2 INT);
      
      INSERT INTO TestTable (cl1, cl2) VALUES ('a', 1), ('a', 2), ('b', 1), ('c', 1), ('c', 2);
      
      INSERT INTO TestTable (cl1, cl2)
      SELECT cl1, 0
      FROM TestTable 
      WHERE cl1 NOT IN (
          SELECT cl1
          FROM TestTable 
          WHERE cl2 IN (1, 2)  
          GROUP BY cl1
          HAVING COUNT(DISTINCT cl2) = 2
      );
      

      MySQL 演示:http://rextester.com/XWHGF50183


      下面的块返回 cl1 那些 cl2 是 1 和 2。根据使用 NOT IN 的结果,你可以得到结果。

      SELECT cl1
      FROM TestTable 
      WHERE cl2 IN (1, 2)  
      GROUP BY cl1
      HAVING COUNT(DISTINCT cl2) = 2
      

      来自answer的帮助

      【讨论】:

      • 问题是您的 below block 返回具有1 或 2而不是@的行987654330@ 和 2。因此,您的外部查询的 not in 子句也将过滤掉所有有效行。
      • @sstan 这是一个复制/粘贴问题。请找fiddle
      【解决方案4】:

      给你:

      insert into [YOUR TABLE NAME] 
            select cl1,0 from [YOUR TABLE NAME] 
          group by cl1 having count(distinct cl2)<> 2
      ;
      

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 2014-08-03
        • 2012-08-12
        • 2023-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多