如何修改SQL查询,获取指定GeoCode主客户及子客户的Trap数据?
正确的SQL查询修改方案
你可以通过两种方式实现需求:获取自身CustomerGeoCode匹配指定值的主客户,以及这些主客户关联的子客户的所有Trap数据。
方法1:使用IN子查询
先筛选出所有符合条件的主客户ID,再关联出他们的子客户ID,最后将这两类ID作为筛选条件:
SELECT Customer.CompanyName, Customer.Address_1 as CompanyAddress, Customer.ZipCode, Customer.City, Customer.CountryCode, Trap.TrapID, Trap.Name FROM Trap INNER JOIN Customer ON Trap.CustomerID = Customer.CustomerID WHERE -- 自身是符合GeoCode条件的主客户,或者是该主客户的子客户 Customer.CustomerID IN ( -- 先取符合GeoCode的主客户ID SELECT CustomerID FROM Customer WHERE CustomerGeoCode = 'code' UNION -- 再取这些主客户的子客户ID SELECT ct.CustomerID FROM CustomerToLevel1 ct INNER JOIN Customer c ON ct.Level1ID = c.CustomerID WHERE c.CustomerGeoCode = 'code' )
方法2:使用JOIN关联层级关系
通过LEFT JOIN关联CustomerToLevel1和主客户,直接筛选出主客户或其下属子客户:
SELECT c.CompanyName, c.Address_1 as CompanyAddress, c.ZipCode, c.City, c.CountryCode, t.TrapID, t.Name FROM Trap t INNER JOIN Customer c ON t.CustomerID = c.CustomerID -- 关联主客户:要么自身是主客户,要么通过层级表找到对应的主客户 LEFT JOIN CustomerToLevel1 ct ON c.CustomerID = ct.CustomerID LEFT JOIN Customer main_c ON COALESCE(ct.Level1ID, c.CustomerID) = main_c.CustomerID WHERE main_c.CustomerGeoCode = 'code'
原写法的问题分析
你之前的exists子查询逻辑错误:
- 子查询中未将当前
Customer表的记录与子查询关联,导致条件判断混乱 - 错误判断“当前客户是否有子客户”,而非“当前客户是否是符合条件的主客户的子客户”
内容的提问来源于stack exchange,提问作者user22065614
相关产品推荐
相关产品推荐

