【问题标题】:How to use a self join on this table instead of the subquery being used when a concatenation is taking place?如何在此表上使用自连接,而不是在发生连接时使用子查询?
【发布时间】:2021-02-11 13:20:45
【问题描述】:

我有以下问题

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 值选择每个代码并将字符串连接到它,并将其作为 code_group 返回。我需要避免使用子查询来降低复杂性,因为它是同一个表,我尝试使用自联接作为

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';

但在这种情况下我得到一个空白结果

【问题讨论】:

  • 你真的使用 IBM db2 吗?如果不是,请删除该标签。
  • 不管怎样,你的子查询不是一个依赖子查询,所以它会执行得很好。如果您将此查询改写为 JOIN,它可能会变得更难阅读,也更难推理。

标签: mysql db2 subquery resultset


【解决方案1】:

查询不等效,因为您在第二个查询中附加了错误的 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'
--*/
;

【讨论】:

  • @amitsingh6651 请将答案标记为已接受。
  • 只是一个问号,可以在 WHERE b.code_group ='EPE_AUTHTYPE' 之后的列 a.code_group 上应用 OR 吗?表示基于哪个联接应用于同一列的 OR?像 WHERE b.CODE_GROUP ='EPE_AUTHTYPE' 或 a.CODE_GROUP = 'EPE_AUTHTYPE' ?因为我使用过,它显示了不同的结果集
  • 您不能只是将任意条件添加到等效的 sql 语句之一并抱怨结果不同。更好的方法是提供一些示例数据、所需的结果以及对您想要实现的目标的一些逻辑描述。
  • 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') 或 a.code_group = 'EPE_AUTHTYPE';所以基本上 a.code_group 应该返回一个包含 _PART 类型结果以及 'EPE_AUTHTYPE 结果的结果集。我忘记在子查询后添加外部 OR a.code_group =' EPE_AUTHTYPE' 。整个查询都需要加入。
猜你喜欢
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2015-09-26
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多