使用 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 列通过子查询加入组的主要内容,如果未能解决你的问题,请参考以下文章
为来自不同表的两个单独操作运行多个子查询(相关)并加入一个表[关闭]