1

2 つのテーブルがあるとします。

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 を超える支店が少なくとも 1 つあるユニークな企業を見つけることです。

1 つの方法は次のとおりです。

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 に答える