假设情况:我在一家定制标牌制作公司工作,我们的一些客户提交的标牌设计数量超过了他们目前使用的数量。我想知道哪些标志从未使用过。
涉及3张表:
表 A - 公司标志
sign_pk(唯一) | 公司_pk | sign_description
1 --------------------1 ---------------- 小
2 --------- -----------1 ---------------- 大
3 -------- 2 ---------------- 中等
4 --------------------------------2 ---------- ------ jumbo
5 --------------------------------3 ---------------- 横幅
表 B - 公司位置
公司_pk | 公司位置(唯一)
1 ---|------ 987
1 ------|------ 876
2 -----|------ 456
2 ------|-------- 123
表 C - 位置标志(有点牵强,但每行可以有 2 个标志,从公司位置到位置标志是一对多的关系)
公司位置 | front_sign | back_sign
987 ------------ 1 ------------ 2
987 ------------ 2 -------- ---- 1
876 ------------ 2 ------------ 1
456 ------------ 3 ---- -------- 4
123 ------------ 4 ------------ 3
因此,a.company_pk = b.company_pk 和 b.company_location = c.company_location。我想尝试查找的是如何查询并取回 sign_pk 5 不在任何位置。针对所有 front_sign 和 back_sign 值查询每个 sign_pk 有点不切实际,因为所有表都有数百万行。表 a 在 sign_pk 和 company_pk 上建立索引,表 b 在两个字段上都有索引,而表 c 仅在公司位置上建立索引。我试图写它的方式是“每个标志都属于一家公司,所以在属于与该标志相关的公司的任何位置找到不是正面或背面标志的标志。”
我原来的计划是:
Select a.sign_pk
from a, b, c
where a.company_pk = b.company_pk
and b.company_location = c.company_location
and a.sign_pk *= c.front_sign
group by a.sign_pk having count(c.front_sign) = 0
只是做前面的标志,然后在后面重复,但这不会运行,因为 c 是外部连接的内部成员,也是内部连接的成员。
整个事情相当复杂,但如果有人能理解它,我会成为你最好的朋友。