0

假设情况:我在一家定制标牌制作公司工作,我们的一些客户提交的标牌设计数量超过了他们目前使用的数量。我想知道哪些标志从未使用过。

涉及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 是外部连接的内部成员,也是内部连接的成员。

整个事情相当复杂,但如果有人能理解它,我会成为你最好的朋友。

4

3 回答 3

1

像这样的东西怎么样:

  SELECT DISTINCT sign_pk
    FROM table_a
   WHERE sign_pk NOT IN
    (   
      SELECT DISTINCT front_sign sign
        FROM table_c
       UNION
      SELECT DISTINCT rear_sign sign
       FROM  table_c
    )
于 2010-04-17T03:14:21.353 回答
0

ANSI 外连接是您的朋友。*= 具有狡猾的语义,应该避免

select distinct a.sign_pk, a.company_pk
from a join b on a.company_pk = b.company_pk 
left outer join c on b.company_location = c.company_location 
                  and (a.sign_pk = c.front_sign or a.sign_pk = c.back_sign) 
where c.company_location is null

请注意,where子句是对连接返回的行的过滤器,因此它说“进行连接,但只给我没有连接到 c 的行”

外连接几乎总是比 NOT EXISTS 和 NOT IN 快

于 2010-04-24T11:46:26.677 回答
0

I would be tempted to create a Temp table for the inner join and then outer join that. But it really depends on the size of your data sets. Yes, the schema design is flawed, but we can't always fix that!

于 2011-11-16T15:01:14.967 回答