【问题标题】:Fastest SQL & HQL Query for two tables两个表的最快 SQL 和 HQL 查询
【发布时间】:2014-04-10 18:37:19
【问题描述】:

表 1:A、B、C 列 表 2:A、B、C 列

表 2 是表 1 的副本,其中包含不同的数据。假设所有列都是 varchar

寻找一个可以获取的高效查询:

  • 表 1 中的 A、B、C 列
  • Table2 中的其他行,其中 Table2.A 的值不存在于 Table1.A 中

对于同一查询,如果 Oracle SQL 和 HQL 之间存在任何差异,我们将不胜感激。

我正在摆弄联接、联合和减号,但无法获得正确的组合。

【问题讨论】:

  • 尝试相交、减、除

标签: sql oracle hibernate hql


【解决方案1】:

SQL:

SELECT *
FROM Table1
UNION ALL
SELECT *
FROM Table2 T2
WHERE NOT EXISTS(
    SELECT 'X' FROM Table1 T1
    WHERE T1.A = T2.A
)

HQL:

您必须执行两个不同的查询,并在 Java 循环中按 Table2 结果丢弃元素,因为在 HQL 中不存在 UNION 命令。

或者,您可以为 Table1 编写第一个查询,而第二个查询必须有一个 not in 子句以丢弃 Table1 A 字段。

解决方案 1:

查询 1:

SELECT * FROM Table1

查询 2: 从表 2 中选择 *

然后在 Java 代码中应用丢弃循环

解决方案 2:

查询 1:

SELECT * FROM Table1

查询 2:

SELECT * FROM Table2 WHERE Table2.A not in (SELECT Table1.A from Table1)

【讨论】:

    【解决方案2】:

    此查询返回table1 中的所有行,加上table2 中不存在于table1 中的所有行,假设列a 是公共键。

    select a,b,c
      from table1
     union 
       all
    select a,b,c
      from table2
     where a not in(select a from table1);
    

    根据 table1 和 table2 的相对大小以及预期的重叠,可能有不同的选项可用。

    【讨论】:

    • 谢谢@Ronnis。查询很成功。但选择了 Joe Taras 的答案,因为它在 HQL 中是一个可行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多