【发布时间】:2014-06-01 02:04:47
【问题描述】:
我有一组如下表。 (这有点简化,其中一些表还有一些其他列,但我已经尝试减少它)
Website
ID |
_____________________________________
10001
10002
10003
Domain Names
Name | Website_ID
_____________________________________
surfinglikewoah.com | 10001
surfinglikewoah.net | 10001
ihatesurfing.com | 10002
surfinghatesme.net | 10003
Promotion Redemptions
Promo ID | Website_ID
_____________________________________
0001 | 10001
0002 | 10001
0003 | 10001
0002 | 10002
Promo Codes
Promo ID | Code
_____________________________________
0001 | test
0002 | super-discount
0003 | double-discount
并且我正在尝试过滤掉任何具有促销“测试”的帐户 - 但是,由于这些网站与多个促销兑换相关联,因此我的结果中仍会出现错误的行。注意:我将根据其他条件进行过滤,同样每行可能有多个值,甚至可能为空。
这是目前的查询:
select distinct
ws.id,
ARRAY(select distinct dn.name FROM domainname dn WHERE ws.id = dn.website_id),
ARRAY(select p.code FROM promotionredemption pr, promotion p WHERE p.id = pr.promotion_id AND pr.site_id = ws.id)
from website ws
left join domainname dn on dn.website_id = ws.id
left join promotionredemption pr on pr.site_id = ws.id
left join promotion p on p.id = pr.promotion_id
where p.code != 'test'
order by
ws.id asc
此查询不应返回 surfinglikewoah.com 结果 - 但它确实返回了,因为该结果还有另外两个与“测试”不匹配的促销兑换。
Results:
10001 | {surfinglikewoah.com, surfinglikewoah.net} | {test, super-discount, double-discount}
10002 | {ihatesurfing.com} | {super-discount}
10003 | {surfinghatesme.net} | {}
我觉得我错过了一些明显的东西!
非常感谢您的帮助。
【问题讨论】:
-
执行一组差异:从不匹配'test'的结果集中减去匹配'test'的结果集。在 SQL Server 中使用 EXCEPT 运算符,如 SELECT ... EXCEPT SELECT ....
-
谢谢 pieter,我正在进一步研究 except 运算符......尽管我也在寻求下面的 NOT EXISTS 建议答案。
-
此链接解释了如何使用 LEFT JOIN 在 SQL 中执行 EXCEPT(或 MINUS)操作:gokhanatil.com/2010/10/minus-and-intersect-in-mysql.html
标签: sql postgresql join left-join