有没有更好的方法来编写这个查询

Posted

技术标签:

【中文标题】有没有更好的方法来编写这个查询【英文标题】:Is there any better way to write this query 【发布时间】:2015-10-08 05:24:32 【问题描述】:

我为我的删除操作设计了下面的查询。我是 SQL 新手,只是想在这里与有经验的人核实一下是否可以或有更好的方法来做到这一点。我正在使用 DB2 数据库

DELETE FROM TableD
    WHERE B_id IN 
     ( 
        SELECT B.B_id
          FROM TableB tB 
            INNER JOIN TableA tA
              ON tB.A_id = tA.A_id
          WHERE A_id = 123
      ) AND 
  C_id IN (1,2,3)

这有两个 IN 子句,我有点担心,不确定是否可以在任何地方使用 EXISTS 子句。

数据库结构如下:

表 A 与表 B 具有一对多关系 表 B 与表 C 具有一对多关系 表 B 与表 D 具有一对多关系 表 D 具有复合主键 (B_id, C_id)

表 D 的数据有点类似于下面

   B_id|C_id
  ----------
   1   |  1
   1   |  2
   1   |  3
   2   |  4
   2   |  5
   3   |  5

在这里,我必须删除值数组中具有 C_id 的行。但由于索引是 B_id 和 D_id 的组合,我正在通过相等运算符 A_id=123 检索与表 A 的特定实体相关的 B_id

【问题讨论】:

“更好”是什么意思?对于给定的数据库设计和存储的数据更好?如果是,那么请添加有关它的信息。如果您的意思是格式,那么,是的,查询看起来不错... :) 哈哈:P 当然,我会添加更多细节。 2 分钟 :) 我添加了更多详细信息 Data_henrik 您似乎正在尝试围绕您的索引设计一个查询——这不是正确的方法。而是围绕查询设计索引。 真正的mustaccio,但它是一个生产数据库并且实施更改并不那么容易:(我必须使用我手头的东西,当事情不工作时,他们会回到我身边解决方案:D 【参考方案1】:

您的方法不一定有任何问题。然而,一个有用的替代技术是merge:

merge into TableD
using ( 
    select distinct 
        B.B_id
      from TableB tB 
        inner join TableA tA on
           tB.A_id = tA.A_id and
           A_id = 123
) AB
on 
    TableD.B_id = AB.B_id and
    C_id in (1,2,3)
when matched then delete;

请注意,我必须在内部查询中使用 distinct 以防止重复匹配。

【讨论】:

【参考方案2】:

你也可以像这样使用合并:

   merge into TableD
   using TableB tB
   on B.B_id = TableD.B_id
   and tB.A_id in (select A_id from TableA tA where A_id = 123)
   and C_id in (1,2,3)
   when matched then delete;

【讨论】:

不幸的是,我没有足够的声誉来否决您复制 dan1111 答案:| 这是使用合并的另一种方式,而不是我的答案的副本。 啊,好吧,那我错了。道歉(: 没问题,这样写的另一种可能性。没有不同但有重复,合并 dan1111 更好。【参考方案3】:

从表 D 中删除 tD 在哪里 存在( 选择 tB.B_id 从 表B tB 在哪里 A_id = 123 AND tB.B_id = tD.B_id ) AND C_id IN (1, 2, 3)

【讨论】:

以上是关于有没有更好的方法来编写这个查询的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来进行这个查询?

有没有更好的方法来编写这个 SparkSQL 语句?

有没有更好的方法来编写这个 BigQuery Sql?

有没有更好、更干净的方法来编写这个本地存储数据

有没有更有效的方法来执行这个嵌套的 SQL 查询?

有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?