1

我想根据另一个表中的列从表中删除行:

Table1:            Table2:
value              value, i

如果 table2.i 小于 1,则从 table1 中删除相应的行(但保留在 table2 中)。

问题是值不是唯一的,所以如果我有这个例如:

 Table1            table2
+-------+        +-----------+
| value |        | value | i |
+-------+        +-----------+
|   5   |        |  5    | 0 |
|   3   |        |  5    | 3 |
+-------+        |  3    | 0 |
                 |  3    | 0 |
                 +-----------+

值 3 应从表 1 中删除(因为表 2 中所有出现的 i<1)但值 5 应保留(因为表 2 中的 i=3 行)

到目前为止我的代码(不起作用):

DELETE FROM Table1, Table2
WHERE (SELECT MIN(Table2.i) FROM Table1, Table2
       WHERE Table1.value = Table2.value) < 1;

问题是:由于我的子查询为所有行返回 min ,所有内容都被删除。

而且我不能在我的子查询中使用“分组依据”,因为这样我的比较是不允许的。

4

4 回答 4

2

试试这个:

DELETE FROM Table1 
WHERE NOT EXISTS(SELECT 1  
                   FROM Table2          
                  WHERE Table2.i > 0 
                    AND Table2.value = Table1.value)
于 2013-06-14T08:41:06.097 回答
1

我不知道你为什么使用 min,而不是你应该使用 max:

尝试这个

     DELETE FROM Table1
   WHERE Table1.value1 = Table2.value1
   and (SELECT MAX(Table2.i) FROM Table2
   WHERE Table1.value1 = Table2.value1) < 1;
于 2013-06-14T08:01:32.553 回答
1

好的,我首先编写一个查询来选择要删除的行,

SELECT
            *
    FROM
       Table1
    EXCEPT
    (
    SELECT
                t1.value
        FROM
                Table1 t1
            JOIN
                Table2 t2
                    ON t2.value = t1.value
        WHERE
                t2.i > 0
    );

见小提琴

然后将 SELECT 更改为 DELETE

DELETE Table1
    FROM
       Table1 t1
    WHERE
       t1.value NOT IN
    (
    SELECT
                t1.value
        FROM
                Table1 t1
            JOIN
                Table2 t2
                    ON t2.value = t1.value
        WHERE
                t2.i > 0
    );

见小提琴

于 2013-06-14T08:06:22.437 回答
0

怎么样:

delete from table1 where value in
    (select value from table2 group by value having max(i) < 1)

按值对表 2 进行分组并having用于检测最大值小于 1 的位置允许您从表 1 中选择要删除的正确值。

having基本上是一个在聚合后where起作用的子句,因此可以与等一起使用。max

这是一个显示它的脚本:

DROP TABLE TABLE1;
DROP TABLE TABLE2;
CREATE TABLE TABLE1 (VALUE INTEGER);
CREATE TABLE TABLE2 (VALUE INTEGER, I INTEGER);
INSERT INTO TABLE1 VALUES (5);
INSERT INTO TABLE1 VALUES (3);
INSERT INTO TABLE2 VALUES (5, 0);
INSERT INTO TABLE2 VALUES (5, 3);
INSERT INTO TABLE2 VALUES (3, 0);
INSERT INTO TABLE2 VALUES (3, 0);

SELECT * FROM TABLE1;
SELECT * FROM TABLE2;

DELETE FROM TABLE1 WHERE VALUE IN
  (SELECT VALUE FROM TABLE2 GROUP BY VALUE HAVING MAX(I) = 0);

SELECT * FROM TABLE1;
SELECT * FROM TABLE2;

该脚本的输出如下所示。首先,所有表的设置:

DROP TABLE TABLE1; DROP TABLE TABLE2;
    TABLE1 DROPPED
    TABLE2 DROPPED
CREATE TABLE TABLE1 (VALUE INTEGER);
    TABLE1 CREATED
CREATE TABLE TABLE2 (VALUE INTEGER, I INTEGER);
    TABLE2 CREATED
INSERT INTO TABLE1 VALUES ((5), (3));
    INSERTED 2 ROWS
INSERT INTO TABLE2 VALUES ((5, 0), (5, 3), (3,0), 3, 0));
    INSERTED 4 ROWS

并显示它们以确保它们符合预期:

SELECT * FROM TABLE1; SELECT * FROM TABLE2;
    VALUE
    -----
      5
      3
    VALUE   I
    -----   -
      5     0
      5     3
      3     0
      3     0

然后运行命令删除相关行:

DELETE FROM TABLE1 WHERE VALUE IN                          
  (SELECT VALUE FROM TABLE2 GROUP BY VALUE HAVING MAX(I) = 0);
    DELETED 1 ROW

您可以看到 3` 行已根据需要从表 1 中消失:

SELECT * FROM TABLE1; SELECT * FROM TABLE2;
    VALUE
    -----
      5
    VALUE   I
    -----   -
      5     0
      5     3
      3     0
      3     0
于 2013-06-14T07:43:07.673 回答