【问题标题】:Subtract one table from another从另一个表中减去一个表
【发布时间】:2014-05-19 09:27:06
【问题描述】:

我有两个带有两个不同选择语句的表。这些表只包含一列。我只想从table1 中的行中减去table2 中的行一次。换句话说:我只想删除一个事件,而不是全部。

表 1:

apple
apple
orange

表2:

apple
pear

结果:

apple
orange

【问题讨论】:

  • 这并不像看起来那么简单。您使用哪个 dbms?不同的 dbms 处理方式不同。
  • 我使用的dbms是MySQL。

标签: sql database


【解决方案1】:

基本上仅供参考如果A={A,A,O},B={A,P} 那么A-B 是逻辑上的

select * from t1 except select * from t2

试试这个!

create table #t(id varchar(10))
create table #t1(id1 varchar(10))
insert into #t values('apple'),('apple'),('orange')
insert into #t1 values('apple'),('pear')


select * from
(
select *,rn=row_number()over(partition by id order by id) from #t
except
select *,rn1=row_number()over(partition by id1 order by id1) from #t1
)x

SEE DEMO

【讨论】:

  • 这将只返回orange,因为除了删除重复项。
  • 是的,您编辑的代码就像我想要的那样工作,谢谢。
【解决方案2】:

这是 Oracle dbms 的答案。诀窍是对每个水果的记录进行编号,以便得到苹果 1、苹果 2 等。然后减去这些集合以保留苹果 2,而苹果 1 被删除。 (row_number 函数需要一个排序顺序,这对我们来说并不重要,但出于语法原因我们必须指定它。)

select fruit
from
(
  select fruit, row_number() over (partition by fruit order by fruit)
  from table1
  minus 
  select fruit, row_number() over (partition by fruit order by fruit)
  from table2
);

【讨论】:

  • 现在你想要 MySQL 一样吗?不幸的是 MySQL 不支持这样的功能。您必须使用在查询中设置和重置的变量。这是他们向您展示如何执行此操作的链接:explodybits.com/2011/11/mysql-row-number。 stackoverflow 中当然也有例子。
  • 谢谢,但我宁愿切换到 Oracle。因为这是一个学校项目并且没有指定确切的 dbms,所以这种方式更容易。
【解决方案3】:

我认为您无法通过单个 SQL 查询删除记录:

据我说,您需要将数据库连接到编程语言,并且需要编写如下算法:

for(all records in table2)
{
    if(record present in table1)
    {
        delete from table1 where record = (record in table2) limit 1;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    相关资源
    最近更新 更多