派生表查询单表重复列问题及指定产品筛选方法咨询
问题分析与修正方案
咱们先拆解下你的问题:你想用派生表筛选符合条件的产品,但原SQL出现了重复列,这是因为语句里存在不必要的自连接操作,咱们一步步理清楚问题所在。
原语句的核心问题
你写的SQL语句是:
select * from ( select * from tblProduct where (P_name like 'S%' or P_name like 'W%') ) A join tblProduct t on t.P_id=a.P_id where a.P_family like '%Stationary%' and a.cost >300
这里的问题点很明确:
- 你先创建了派生表
A,已经过滤出名称以S/W开头的产品 - 随后又把
A和原表tblProduct做JOIN关联,这会把A的每一行和原表中同P_id的行合并,导致所有列(比如P_id、P_name、cost等)重复出现(一次来自A,一次来自t) - 更关键的是,你的WHERE条件完全依赖
A的列,根本不需要t表的任何数据,这个自连接完全是冗余的
修正后的正确写法
写法1:保留派生表逻辑(去掉冗余连接)
把后续筛选条件直接加在派生表之后,不需要关联原表:
SELECT A.* FROM ( SELECT * FROM tblProduct WHERE (P_name LIKE 'S%' OR P_name LIKE 'W%') ) A WHERE A.P_family LIKE '%Stationary%' AND A.cost > 300;
或者更干脆,把所有筛选条件都整合到派生表内部:
SELECT * FROM ( SELECT * FROM tblProduct WHERE (P_name LIKE 'S%' OR P_name LIKE 'W%') AND P_family LIKE '%Stationary%' AND cost > 300 ) A;
写法2:完全不需要派生表(更简洁高效)
其实你的需求完全可以用单表查询实现,没必要引入派生表:
SELECT * FROM tblProduct WHERE (P_name LIKE 'S%' OR P_name LIKE 'W%') AND P_family LIKE '%Stationary%' AND cost > 300;
总结
你的原语句错误根源是多余的自连接,既导致了重复列,又增加了不必要的查询开销。只要去掉那个JOIN操作,直接基于派生表做筛选,或者用更简洁的单表查询,就能得到符合要求的结果集。
内容的提问来源于stack exchange,提问作者sampath acharya
相关产品推荐
相关产品推荐

