如何在此 table 上使用自联接而不是在进行串联时使用子查询?
How to use a self join on this table instead of the subquery being used when a concatenation is taking place?
我有以下查询
Select DISTINCT a.code,a.Code_group,a.value,a.code_auth FROM AEO.CODE_CM a WHERE a.CODE_GROUP IN
(SELECT CONCAT (b.code,'_PART') FROM AEO.CODE_CM b WHERE b.CODE_GROUP ='EPE_AUTHTYPE');
因此,根据接收到的 code_group 值,它会选择每个代码并将字符串连接到它,returns 将其作为 code_group。我需要避免使用子查询来降低它的复杂性,因为它是相同的 table 我尝试使用 self join as
Select DISTINCT a.code,a.Code_group,a.value,a.code_auth FROM AEO.CODE_CM a INNER JOIN AEO.CODE_CM b
ON a.code_group =b.code_group WHERE a.code_group = CONCAT(b.code,'_PART') AND b.code_group ='EPE_AUTHTYPE';
但在这种情况下我得到的结果是空白
查询不等价,因为您在第二个查询中有错误的附加 a.code_group = b.code_group
谓词。
它应该是这样的:
WITH AEO_CODE_CM (CODE, CODE_GROUP) AS
(
VALUES
('code1', 'EPE_AUTHTYPE')
, ('code2', 'code1_PART')
)
Select DISTINCT a.code, a.Code_group
FROM AEO_CODE_CM a
/*
WHERE a.CODE_GROUP IN
(
SELECT CONCAT (b.code,'_PART')
FROM AEO_CODE_CM b
WHERE b.CODE_GROUP ='EPE_AUTHTYPE'
)
*/
--/*
JOIN AEO_CODE_CM b ON a.code_group = CONCAT(b.code,'_PART')
WHERE b.code_group ='EPE_AUTHTYPE'
--*/
;
我有以下查询
Select DISTINCT a.code,a.Code_group,a.value,a.code_auth FROM AEO.CODE_CM a WHERE a.CODE_GROUP IN
(SELECT CONCAT (b.code,'_PART') FROM AEO.CODE_CM b WHERE b.CODE_GROUP ='EPE_AUTHTYPE');
因此,根据接收到的 code_group 值,它会选择每个代码并将字符串连接到它,returns 将其作为 code_group。我需要避免使用子查询来降低它的复杂性,因为它是相同的 table 我尝试使用 self join as
Select DISTINCT a.code,a.Code_group,a.value,a.code_auth FROM AEO.CODE_CM a INNER JOIN AEO.CODE_CM b
ON a.code_group =b.code_group WHERE a.code_group = CONCAT(b.code,'_PART') AND b.code_group ='EPE_AUTHTYPE';
但在这种情况下我得到的结果是空白
查询不等价,因为您在第二个查询中有错误的附加 a.code_group = b.code_group
谓词。
它应该是这样的:
WITH AEO_CODE_CM (CODE, CODE_GROUP) AS
(
VALUES
('code1', 'EPE_AUTHTYPE')
, ('code2', 'code1_PART')
)
Select DISTINCT a.code, a.Code_group
FROM AEO_CODE_CM a
/*
WHERE a.CODE_GROUP IN
(
SELECT CONCAT (b.code,'_PART')
FROM AEO_CODE_CM b
WHERE b.CODE_GROUP ='EPE_AUTHTYPE'
)
*/
--/*
JOIN AEO_CODE_CM b ON a.code_group = CONCAT(b.code,'_PART')
WHERE b.code_group ='EPE_AUTHTYPE'
--*/
;