SQLite查询需求:获取指定公司可用或无限制的促销活动
嘿,刚好能帮你解决这个SQL查询的问题!咱们先理清楚需求,再一步步写出符合要求的语句~
需求与表结构梳理
需求明确
我们需要用单条SQL查出满足以下任一条件的促销活动:
- 直接关联了指定公司的促销
- 未关联任何公司的促销(这类促销对所有公司生效)
表结构说明
涉及的三张表结构如下:
Promotion(idPromo, namePromo) Company(idCompany, nameCompany) PromoCompany(idPromo, idCompany)
核心SQL查询语句
假设我们要查询的目标公司ID是1(你可以根据实际需求替换成具体的ID,比如示例里的10或12),最终的查询语句是:
SELECT DISTINCT p.idPromo, p.namePromo FROM Promotion p LEFT JOIN PromoCompany pc ON p.idPromo = pc.idPromo WHERE pc.idCompany = 1 OR pc.idPromo IS NULL;
逻辑解释
这里用了**左连接(LEFT JOIN)**来保留所有促销活动,然后通过WHERE条件精准筛选:
pc.idCompany = 1:筛选出和指定公司直接关联的促销pc.idPromo IS NULL:筛选出没有任何公司关联的促销(左连接后没有匹配到PromoCompany的记录,这类促销对所有公司生效)- 加
DISTINCT是为了避免同一个促销关联多个公司时出现重复结果(比如示例里的促销1关联了两家公司,查询其中一家时会返回两条重复的促销1记录,用DISTINCT就能去重)
结合数据示例验证
咱们用你给出的测试数据来验证效果:
测试数据
Promotion: [{ idPromo:1, namePromo:"promo test" }, { idPromo:2, namePromo:"promo test 2" }] Company: [{ idCompany:10, nameCompany:"CompanyPloof" },{ idCompany:12, nameCompany:"CompanyPaf" } ] PromoCompany: [{ idPromo:1, idCompany:10 },{ idPromo:1, idCompany:12 } ]
场景1:查询CompanyPloof(idCompany=10)
把SQL里的1替换成10,执行后会返回:
- 促销1:因为它关联了CompanyPloof(id=10)
- 促销2:因为它没有任何公司关联限制
结果和你预期的一致,返回idPromo=1和2的促销。
场景2:查询CompanyPaf(idCompany=12)
把SQL里的1替换成12,执行后会返回:
- 促销1:因为它关联了CompanyPaf(id=12)
- 促销2:因为它没有任何公司关联限制
(注:这里和你提到的预期略有出入,可能是笔误哦~按照表数据逻辑,促销1确实对CompanyPaf生效,应该被包含在结果里)
内容的提问来源于stack exchange,提问作者Emmanuel
相关产品推荐
相关产品推荐

