2017-01-03 43 views
1

問題を解決できません。タスクは次のとおりです。SQL - 同じ列を2回選択して条件が異なる場合

従業員の氏名と所属者名が表示されます。以下のように

output

一つだけのテーブルがあります:

table

私はこれまでのところ、これを試してみました:

SELECT 
    ID, 
    Name, 
    Boss, 
    (SELECT Name FROM Employees WHERE ID IN (SELECT Boss FROM Employees)) 
FROM Employees 

をしかし、それは私に与えますエラー:

"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression"

私は助けに感謝します。

+1

サブクエリの代わりに左結合を使用しないのはなぜですか? –

答えて

6

自己結合が必要です。次のようなものがあります。

Select a.ID, a.Name, b.ID, b.Name 
from Employees A 
left join Employees B 
on a.Boss = b.ID 
+0

応答ありがとうございます、今すぐ動作します。 – Czapa

1

これを行う1つの方法は、TOP句を使用して最初の結果のみを返すようにサブクエリを制限することです。メインテーブルにも参加する必要があります。

SELECT 
    e.ID, 
    e.Name, 
    e.Boss, 
    (SELECT top 1 Name FROM Employees b where b.ID = e.Boss) as BossName 
FROM Employees e 
+1

オーダーのないトップを使用することは、一般的には良いアプローチではありません。クエリが1行以上を返す場合は、どの行が返されるかを確認する方法があります。しかし、この場合、おそらくうまくいくでしょう。 –

+0

または 'top 1'ではなく' distinct'です – Beth

+0

応答ありがとうございます、今すぐ動作します。 – Czapa

0

APHの回答は間違いなく最も効果的です。しかし、私はあなたが動作しているクエリに非常に近いことを示す相関サブクエリを持つソリューションを追加したいと思います。

SELECT 
    E.ID, 
    E.Name, 
    E.Boss, 
    (SELECT Name FROM Employees WHERE ID = E.Boss) AS BossName 
FROM Employees E 

元のクエリの問題は、サブクエリ内の条件が特定のレコードに依存しないことでした。サブクエリは、他の誰かの上司であるすべての従業員の名前を返しました。

このソリューションは、通常、すべての項目に対してサブクエリを実行する必要があるため、ジョインよりパフォーマンスが悪いことに注意してください。結果は結合の結果と同等ですが、多くのオプティマイザはサブクエリに触れないため、これを認識しません。

+0

ありがとうございます!それは私の基本的な考え方に最も似ています。 – Czapa

関連する問題