1

假设我们有两个表:

Company
+---+-----+
|id | name|
+---+-----+
|1  | bar |
|2  | foo |
+---+-----+

Branch
+----+----+-------+
|cid | id | profit|
+----+----+-------+
|1   | 10 | 100   |
|1   | 11 | 200   |
|2   | 20 | 50    |
+----+----+-------+

--cid in Branch is the foreign key to company id

查询是找出至少有一个分公司利润大于 100 的独特公司。

一种方法是:

SELECT DISTINCT c.id, c.name 
  FROM Company c, Branch b
  WHERE c.id == b.cid AND b.profit > 100;

特定情况是很少有公司有分支机构(基本上 Branch 表中的条目远少于 Company 中的条目。鉴于此信息,上述查询是最好的吗?或者有没有其他选择?

4

3 回答 3

2

您的查询看起来不错,我建议使用 ANSIJOIN语法:

SELECT DISTINCT c.id, c.name 
FROM Company c
INNER JOIN Branch b
  ON c.id = b.cid 
WHERE b.profit > 100;
于 2013-01-22T16:41:51.203 回答
2

更有效的方法可能是使用 EXISTS 子句:

SELECT c.id, c.name 
FROM Company c
WHERE EXISTS
(SELECT 1
 FROM Branch b
 WHERE c.id = b.cid AND b.profit > 100)
于 2013-01-22T16:43:15.447 回答
1

您的查询在我看来是正确的,尽管我可能使用内部联接与交叉联接,但相同。也许使用子查询可以使它更快一些——不尝试就不确定:

SELECT DISTINCT c.id, c.name 
  FROM Company c JOIN (
    SELECT CID FROM Branch WHERE Profit > 100) t ON c.id = t.id

不确定这是否会更快。

于 2013-01-22T16:40:55.510 回答