使用 substr 列通过子查询加入组

Posted

技术标签:

【中文标题】使用 substr 列通过子查询加入组【英文标题】:Joining a group by subquery with substr columns 【发布时间】:2020-12-22 00:01:23 【问题描述】:

我正在尝试通过子查询将组与另一个表加入,但由于子查询包含仅在子查询中有效的别名,因此遇到了问题。问题是 AREA 表只有 3 位储物柜 ID 作为 ARE_CODE 列中较长字符串的一部分嵌入,这就是我使用 substr 的原因。这是子查询分组:

SELECT SUBSTR(ARE_CODE,0,3) AS "Locker", COUNT(ARE_UID) AS "Qty"
FROM AREA
WHERE SUBSTR(ARE_CODE,0,1)='L' 
GROUP BY SUBSTR(ARE_CODE,0,3)

它自己运行良好 - 问题是我试图将它与主查询中的另一个表连接起来。别名仅在子查询本身内有效,不能像我在下面所做的那样被引用。我也尝试过直接加入 substr 函数,但这也不起作用。

SELECT P.Locker, P.Permit, L.Qty
FROM PERMITS P
INNER JOIN (SELECT SUBSTR(ARE_CODE,0,3) AS "Locker", COUNT(ARE_UID) AS "Qty"
    FROM AREA_LKP
    WHERE SUBSTR(ARE_CODE,0,1)='L' 
    GROUP BY SUBSTR(ARE_CODE,0,3) L ON L.Locker = P.Locker

关于如何解决此问题的任何建议?

【问题讨论】:

【参考方案1】:

您只需要从别名中删除双引号,因为它们使别名区分大小写,并且您必须将它们与双引号一起使用,无论您想在查询中使用它们的确切大小写.

所以最好不要在别名中使用双引号,除非您想给出区分大小写的名称或希望在别名中有空格。

SELECT P.Locker, P.Permit, L.Qty
FROM PERMITS P
INNER JOIN (SELECT SUBSTR(ARE_CODE,0,3) AS Locker, COUNT(ARE_UID) AS Qty
    FROM AREA_LKP
    WHERE SUBSTR(ARE_CODE,0,1)='L' 
    GROUP BY SUBSTR(ARE_CODE,0,3) L ON L.Locker = P.Locker

【讨论】:

【参考方案2】:

问题是双引号。但是您的查询还有其他怪癖:

在字符串中,第一个字符为 1,而不是 0(尽管允许为 0)。 LIKE 是进行字符串比较的好方法。

所以:

SELECT P.Locker, P.Permit, L.Qty
FROM PERMITS P INNER JOIN
     (SELECT SUBSTR(ARE_CODE, 1, 3) AS Locker, COUNT(*) AS Qty
      FROM AREA_LKP
      WHERE ARE_CODE LIKE 'L%'
      GROUP BY SUBSTR(ARE_CODE, 1, 3)
     ) L
     ON L.Locker = P.Locker;

我应该注意LIKE 允许在列上使用索引,但SUBSTR() 通常会阻止。

【讨论】:

【参考方案3】:

为什么要在子查询末尾设置表的别名?

INNER JOIN (SELECT SUBSTR(ARE_CODE,0,3) AS "Locker", COUNT(ARE_UID) AS "Qty"
    FROM AREA_LKP
    WHERE SUBSTR(ARE_CODE,0,1)='L' 
    GROUP BY SUBSTR(ARE_CODE,0,3) L

试试:

INNER JOIN (SELECT SUBSTR(ARE_CODE,0,3) AS "Locker", COUNT(ARE_UID) AS "Qty"
    FROM AREA_LKP L
    WHERE SUBSTR(ARE_CODE,0,1)='L' 
    GROUP BY SUBSTR(ARE_CODE,0,3)

要在不同语句之间共享表达式,请查看 with 语句: https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/with.html

最后,你确定:

L.Locker = P.Locker

可以按预期进行评估吗?那么L.Locker的子串值和P.Locker一样吗?

【讨论】:

以上是关于使用 substr 列通过子查询加入组的主要内容,如果未能解决你的问题,请参考以下文章

试图从 2 个正在加入的子查询中获取一列并且分组不起作用

为来自不同表的两个单独操作运行多个子查询(相关)并加入一个表[关闭]

从列列表中删除选择子查询到主查询

Oracle:如何通过将子查询删除到条件或加入同一张表来提高查询?

sql server 子查询连接错误

查询优化,(子查询)(sql-transact)