【问题标题】:Remove row if values in one column if found in another in Oracle SQL如果在 Oracle SQL 中的另一列中找到值,则删除行
【发布时间】:2021-09-23 21:26:40
【问题描述】:

我有下表,其中每个客户有两列。如果每个客户在 A 列中,我想删除 B 列中的行。在此示例中,我们将为 Tom 删除 B 列中带有“123”的行,因为它位于 A 列中。
很抱歉造成混乱。

Client Column A Column B
Tom 123 560
Tom 544 123
Bob 658 85
Tom 32 123
Sean 45 105

输出

Client Column A Column B
Tom 123 560
Bob 658 85
Sean 45 105

【问题讨论】:

  • 您删除带有DELETE 的行。您可以使用EXISTS 查看是否存在一行。 (您也可以为此使用IN。)您到底遇到了什么问题?我的提示是否已经帮助您解决了这个问题?
  • 这不会让您完全没有具有相同值的记录吗?这正是您想要实现的目标吗?
  • @groovy_guy,很抱歉我最初的帖子不清楚。我已经编辑了问题/示例。基本上,如果在每个客户的 A 列中找到 B 列中的值,我希望删除一行。
  • 好的,你想删除重复的cients,以便每个客户端保留一行。 (一旦您这样做了,您可能应该对该列实施唯一约束,以免将来出现重复。)您如何决定保留一行?为什么您保留的是 Tom|123|560 而不是其他 Tom 条目之一?
  • 再说一遍:你到底遇到了什么麻烦?是什么阻止您使用EXISTS 编写DELETE 声明?

标签: sql oracle


【解决方案1】:
DELETE tableclients FROM tableclients
WHERE columnB IN (SELECT columnA from tableclients)

这应该可以解决, 这是一个简单有效的查询,希望您能从中得到所需的结果

【讨论】:

  • 哦,我实际上在其他地方写了那个查询并发布了相同的它也可以在没有 back quotes ` 的情况下工作
  • 。 .此代码在 Oracle 中仍然无法使用。这是正确的想法,但您应该使用 DB Fiddle 或类似的工具来获取工作代码。
  • @GordonLinoff 在我很确定您也可能对此有答案之前,我已经遇到了您的一些答案。我对这个感到困惑。如果您能指导如何解决这个问题,那将非常有帮助:)
  • 问题标记为 Oracle。例如,您可以在 dbfiddle.uk 上测试 Oracle 查询。
  • @GordonLinoff 感谢您的帮助。我检查了dbfiddle.uk,更新后的查询似乎在那里工作这是降价dbfiddle.uk/…
【解决方案2】:

您可以使用 not exists 子句或 not in 子句来做到这一点。

select t1.*
from Your_Table t1
where not exists (
  select null 
  from Your_Table t2 
  where t2.Client = t1.Client and t2.Column_A = t1.Column_B
  )
;

select t1.*
from Your_Table t1
where (t1.Client, t1.Column_B) not in (
  select t2.Client, t2.Column_A 
  from Your_Table t2
)
;

demo

【讨论】:

    【解决方案3】:

    我希望这会对你有所帮助。 这是 MySql 过程

    CREATE PROCEDURE DBname.deleteRecord()
    BEGIN
    
    DROP TABLE IF EXISTS `temp`;
    create table temp select    b.Column2  as Column2  from  
    clienttable  a  inner join 
    clienttable  b where  a.Column1  = b.Column2 AND a.client  =   b.client ; 
    
    delete   FROM  clienttable  WHERE  Column2 in (select  b.Column2    
    from  temp b );
    
    SELECT * from  clienttable ;
    
    
    END
    

    打电话

    调用 DBname.deleteRecord()

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      declare @TableIntersect table(Name nvarchar(max))
      
      insert into @TableIntersect(Name) SELECT Name  
          FROM ColumnA  
          INTERSECT  
          SELECT Name
          FROM ColumnB
      
      delete from YourTable where ColumnA in (select Name from @TableIntersect)
      delete from YourTable where ColumnB in (select Name from @TableIntersect)
      

      【讨论】:

      • 这个答案是特定于 DBMS 的。 SQL Server 可能吗?它也不必要地广泛(并且有点缺陷)。原始请求“b 存在于 a”中,只需 delete from t where b in (select a from t) 即可解决。
      【解决方案5】:

      你可以这样做很简单

      delete from table  where column2 in (select column1 from table)
      

      我测试了它并得到了实际结果

      【讨论】:

      • 第一 -> 不允许在内部查询中使用同一张表,第二 -> 这也会删除另一个客户记录
      • 您的输出表明,删除 B 列中值为 123 的两行!
      • 是的,但首先它会找到那些键
      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2019-08-29
      • 2020-09-29
      • 2022-10-14
      相关资源
      最近更新 更多