通过对现有表的列进行条件调整来创建新表

creating new table by conditioning on columns of existing table

提问人:Megha 提问时间:10/21/2023 最后编辑:Megha 更新时间:10/21/2023 访问量:42

问:

我是一个新的sql学习者。我遇到了以下问题:

假设我有下表:

编号 细节
答1 11
答1 12
答1
答1 0
答2 11
答2 13

现在,我想创建一个包含两列 ID 和结果(例如)的新表,其中每个 ID 出现一次。如果与 ID 对应的任何行在详细信息列中有 12,则 result = 1,否则为 0。所以基本上我的结果应该是下表:

编号 细节
答1 1
答2 0

我试图解决这个问题的尝试是:

insert into new_table select ID, (select detail,
                                     (case
                                        when detail = 12 then '0'
                                        else '1'
                                      end) as new_column from table) 
from table;

但是这段代码给了我错误:操作数应该包含 1 列。我不知道如何处理这个问题。请帮助我了解如何解决这个问题。我正在MySql中尝试这个。

SQL MySQL Group-By 案例

评论

0赞 Andrew 10/21/2023
请使用您收到的错误更新您的帖子,并添加适当的 dbms 标签。
1赞 nbk 10/21/2023
子选择只能返回一个 SCALR 值,而不能返回 2 列

答:

3赞 Isolated 10/21/2023 #1

使用 CTAS 语句创建表,并使用带有聚合的案例表达式。

create table table2 as (
  select id, 
   max(case when detail = 12 then 1 else 0 end) as detail
  from table1
  group by id
  );
编号 细节
答1 1
答2 0
1赞 Bill Karwin 10/21/2023 #2

您不需要子查询。您可以直接在选择列表中创建表达式。

使用 GROUP BY 使结果每个 ID 值有一行。

INSERT INTO new_table 
SELECT ID, MAX(CASE detail WHEN 12 THEN 1 ELSE 0 END)
FROM old_table
GROUP BY ID;
1赞 nbk 10/21/2023 #3

EXISTS将只返回正确的标量值,并且速度很快

CREATE TABLE old_table
    (`ID` varchar(2), `detail` varchar(4))
;
    
INSERT INTO old_table
    (`ID`, `detail`)
VALUES
    ('A1', '11'),
    ('A1', '12'),
    ('A1', NULL),
    ('A1', '0'),
    ('A2', '11'),
    ('A2', '13')
;

Records: 6  Duplicates: 0  Warnings: 0
CREATE TABLE new_table
    (`ID` varchar(2), `detail` varchar(4))
;
INSERT INTO new_table
SELECT DISTINCT ID, (EXISTS(SELECT 1 FROM old_table o2 WHERE o2.`detail` = 12 AND o2.ID = o1.ID))
FROM old_table o1
Records: 2  Duplicates: 0  Warnings: 0
SELECT* FROM new_table
编号 细节
答1 1
答2 0

小提琴