【问题标题】:SQL SUB SELECTS and LEFT JOINS with WHERE ClauseSQL SUB SELECTS 和 LEFT JOINS 与 WHERE 子句
【发布时间】:2015-10-21 16:09:58
【问题描述】:

在第二个 SUB-SELECT 中保留 WHERE 子句是否更有效。双向工作,但我正在寻找使用此 SQL 语句的最有效方式...

表 2 t2 中有很多 substr(FIELD_G,10,3) 的记录和值,所以我不确定是否应该在左加入之前先在第二个 SUB-SELECT 中过滤掉它???

我的问题是我应该在 JOINING 之前过滤第二个 SUB-SELECT 中的结果还是应该消除 WHERE 子句(在第二个 SUB-SELECT 中),检索所有内容并依靠 LEFTJOIN 给我结果???

如果 CNT 等于 0 - 我仍然需要返回 t1.FIELD_A、t1.FIELD_B、t1.FIELD_C、t1.FIELD_D 字段...

SELECT t1.FIELD_A, t1.FIELD_B, t1.FIELD_C, t1.FIELD_D, t2.CNT FROM (
    SELECT FIELD_A, FIELD_B, FIELD_C, FIELD_D
    FROM SCHEMA.TABLE_A
    WHERE FIELD_A IN ('Z1','Z2','Z3','Z4','Z5','Z6','Z7','Z8','Z9','Z10','Z11','Z12','Z13','Z14','Z15','Z16','Z17','Z18','Z19','Z20','Z21','Z22')
              ) t1
    LEFT JOIN
              (
    SELECT FIELD_A, COUNT(FIELD_A) AS CNT FROM (
    SELECT substr(FIELD_G,10,3) AS FIELD_A
    FROM SCHEMA.TABLE_B
    WHERE substr(FIELD_G,10,3) IN ('Z1','Z2','Z3','Z4','Z5','Z6','Z7','Z8','Z9','Z10','Z11','Z12','Z13','Z14','Z15','Z16','Z17','Z18','Z19','Z20','Z21','Z22')
    ) GROUP BY FIELD_A
              ) t2

    ON t1.FIELD_A = t2.FIELD_A
    ORDER BY t1.FIELD_A
  ;

【问题讨论】:

  • 您可以随时为这两个查询计时。
  • 无法访问您的数据库及其数据的任何人都无法明确表示查询的某个版本会更好或更差。比较两个查询的执行计划,并(正如@DanBracuk 建议的)执行时间。祝你好运。
  • “更高效”是什么意思?

标签: sql oracle select subquery sql-subselect


【解决方案1】:

您正在尝试使用过滤器在查询中获取聚合值。问题是聚合是针对所有数据完成的,而不是过滤后的子集。因此,您的查询重复了条件。

另一种方法是关联子查询:

SELECT t1.FIELD_A, t1.FIELD_B, t1.FIELD_C, t1.FIELD_D,
       (SELECT COUNT(*)
        FROM SCHEMA.TABLE_B b
        WHERE substr(b.FIELD_G, 10, 3) = t1.FIELD_A
       ) as cnt
FROM SCHEMA.TABLE_A t1 LEFT JOIN
WHERE t1.FIELDA IN ('Z1', 'Z2', 'Z3', 'Z4', 'Z5', 'Z6', 'Z7', 'Z8', 'Z9', 'Z10',
                    'Z11', 'Z12', 'Z13', 'Z14', 'Z15', 'Z16', 'Z17', 'Z18', 'Z19', 'Z20',
                   'Z21', 'Z22')
ORDER BY t1.FIELD_A;

【讨论】:

  • Gordon - 这不起作用 - WHERE 子句附近的表名无效
  • 你的第一段让我很困惑,但我想这是对 OP 为何像他那样构建示例查询的分析(而不是对他的方法的批评)。
【解决方案2】:

你能试试这个查询吗

SELECT t1.FIELD_A, t1.FIELD_B, t1.FIELD_C, t1.FIELD_D, t2.CNT
   FROM SCHEMA.TABLE_A t1
   LEFT JOIN  (
                SELECT FIELD_A, COUNT(FIELD_A) AS CNT FROM (
                SELECT substr(FIELD_G,10,3) AS FIELD_A
                FROM SCHEMA.TABLE_B ) GROUP BY FIELD_A 
    ) t2
    ON t1.FIELD_A = t2.FIELD_A
    WHERE t1.FIELD_A IN ('Z1','Z2','Z3','Z4','Z5','Z6','Z7','Z8','Z9','Z10','Z11','Z12','Z13','Z14','Z15','Z16','Z17','Z18','Z19','Z20','Z21','Z22')
   ORDER BY t1.FIELD_A ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多