0

我正在尝试执行以下语句:

DELETE a
FROM db.table1 a
    INNER JOIN (SELECT domainname
                FROM db.table1
                WHERE domainname LIKE '%.uci.edu'
                GROUP BY keyvalue
                HAVING COUNT(1) > 1
        ) b ON a.id = b.id 

我得到了标题中提到的错误。我想要达到的目标已在此处进行了解释:如何使一个查询的结果出现在 NOT IN 子句中?

请帮我完成这项任务。为什么 b.id 未知?我没有这种类型的加入经验。我理解加入两个不同的表格,但是对于这个声明,有人可以解释一下吗?请注意,这domainname是唯一的价值。主键是 theid并且它是 auto_increment 但我不使用它来区分列。我主要使用另一个domainname_no独特的值。

编辑:上面的命令不起作用。

我需要的是以下内容:我有一个域名列表。说:aa.yahoo.com、bb.yahoo.com、cc.yahoo.com、aa.msn.com。每个域名都有一个键值。如果密钥是共享的,我想删除这条记录。因此,我选择了按键值分组的不同值。如果记录不在不同的集合中,并且具有相同的顶级域,那么我不需要它。

示例:我的表:cert_id | 域名 | 域证书 | 键 1 | a.yahoo.com | a.yahoo.com_1 |5555 2 | a.yahoo.com | a.yahoo.com_2 |6666 3 | b.yahoo.com | b.yahoo.com_1 |5555 4 | b.yahoo.com | c.yahoo.com_2 |6666

每个域可能有多个与密钥关联的证书。如果一个或多个不同域名的证书具有相同的密钥,我想删除它。

现在,我有两个域名,它们a.yahoo.com具有b.yahoo.com相同的密钥。我需要删除b.yahoo.com任何具有相同模式的域名,如“%.yahoo.com”,但不等于a.yahoo.com不同的值。

目前,我正在做的是查询不同的值:

select distinct domainname 
from db.table1
where domainname like '%.uci.edu'
group by keyvalue
order by domainname

然后删除任何不在不同列表中且具有相同模式的值%.yahoo.com

delete from db.table1 where domain not in ( I type the list of distinct domain 
names manually)
and domainanme like '%.yahoo.com';

我希望问题现在很清楚。

但是这个命令不起作用。详情见:如何使一个查询的结果在 NOT IN 子句中?

4

2 回答 2

0

您没有IDSubQuery. 试试这个:

DELETE a
FROM db.table1 a
    INNER JOIN (SELECT id, domainname             -- added ID field
                FROM db.table1
                WHERE domainname LIKE '%.uci.edu'
                GROUP BY keyvalue
                HAVING COUNT(1) > 1
        ) b ON a.id = b.id                        -- ID was used here
于 2012-08-06T15:48:01.550 回答
0

您没有加入两个表,将 table1 加入查询结果,并且您没有在该查询中包含 id 列。SELECT id, domainname在子查询的开头尝试。

于 2012-08-06T15:48:30.117 回答