如何在新表中选择特定行?

时间:2018-10-01 10:07:13

标签: sql sqlite

我正在使用SQLite3。我有一个表MyTable,如下所示:

Create table mytable (ID as INTEGER, OrderID as INTEGER);

Insert into mytable (ID, OrderID) values (1, 1);
Insert into mytable (ID, OrderID) values (1, 2);
Insert into mytable (ID, OrderID) values (2, 1);
Insert into mytable (ID, OrderID) values (2, 3);
Insert into mytable (ID, OrderID) values (3, 1);

对于具有相同ID但不同OrderID的两行,例如(1,1)和(1,2),我们将它们称为重复行。

现在,我需要挑选出所有重复的行,并将它们放入名为MyDupTable的新表中。对于以上示例,MyDupTable应该包含:

(1, 1);
(1, 2);
(2, 1);
(2, 3);

因此,我使用以下语句:

Select * into MyDupTable from MyTable group by ID having Count(ID) > 1;

但是sqlite给出了一条错误消息“靠近”,语法错误”,为什么?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用sub-query进行操作,子查询将选择所有重复的ID,然后使用in从表中选择其余列并将其插入新表中

insert into MyDupTable 
select * from mytable where ID in(
    select ID from mytable
     group by ID
    having Count(*) > 1
    )

您可以使用现有表创建表

CREATE TABLE MyDupTable AS 
   select * from mytable where ID in(
        select ID from mytable
         group by ID
        having Count(*) > 1
        )

您的查询分析

Select * into MyDupTable from MyTable group by ID having Count(ID) > 1;

1。您已使用group by id,但未从MyTable中找到任何选择列,选择中使用的列数必须在group by中使用

  1. in sql lite insert table docs

答案 1 :(得分:0)

我会在INSERT INTO. . .中使用EXISTS语句:

INSERT INTO MyDupTable (ID, orderid)
     SELECT ID, orderid
     FROM mytable mt
     WHERE EXISTS (SELECT 1 FROM mytable mt1 WHERE mt1.ID = mt.ID AND mt.orderid <> mt1.orderid);   

注意:

  • 使用INSERT INTO语句时,始终限定所有列名称。