SQL查询从多个表中获取不同的行

时间:2013-01-22 16:37:08

标签: sql postgresql

假设我们有两个表:

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;

特殊情况是很少有公司有分支机构(基本上分支表中的条目远远少于公司中的条目。鉴于此信息是上述查询最好的可能吗?还是有其他选择?

3 个答案:

答案 0 :(得分:2)

您的查询看起来很好,我建议使用ANSI JOIN语法:

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

答案 1 :(得分: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)

答案 2 :(得分:1)

你的查询看起来对我来说,虽然我可能会使用内连接和交叉连接,但相同。也许使用子查询可以使它更快一点 - 不确定而不尝试它:

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

不确定是否会更快。