2017-02-15 15 views
3

元々サブクエリであったこれらの2つのクエリは、私が結合で行いたいサブクエリでしたが、これを正しく行う方法がわかりません。2つのサブクエリではなく、1つの結合を使用する方法

私の小さな例のテーブルには、これらのフィールドは必須ですので、彼らはすべての参加することができ、この

SupplierId|CompanyName|Country 

のように見えます。私の元副問合せは、私のクエリの最初の部分は、私のクエリの2番目の部分は相関すべてのサプライヤーを見つけた会社名に属し、Germay

を返す国を見つけることです。この

select * 
from Suppliers 
where CompanyName != 'Nord-Ost-Fisch Handelsgesellschaft mbH'and Country = 
(Select country 
from Suppliers 
where CompanyName = 'Nord-Ost-Fisch Handelsgesellschaft mbH'); 

のように見えます上記のクエリにWhere Country = 'Germany'はにハードコードされてはならない。

Select * 
From Suppliers 
Where Country = 'Germany' -- this based on above statement 
and CompanyName != 'Nord-Ost-Fisch Handelsgesellschaft mbH' 

私はちょうど私がこの2つのテーブルに参加した場合、どのように私はまだ国を得ることができる方法を確認するために失敗しています。この

Select * 
From Suppliers s join Suppliers ss 
on s.SupplierID = ss.SupplierID 
Where ... 

のようなルックスをしようとしていますクエリその結果に対して照会します。

+0

あなたは、両方のテーブルのフィールドをリストすることができますか? – r0xette

答えて

2

まず、この場合、サブクエリを保持できないという固有の理由はありません。私は実際にそれが意図を少しはっきりさせると思う。

しかし、あなたがしたい場合は代わりに自己の参加は、ここにそれがどのように見えるかです(私は単に国によってフィルタリングされたテーブルの実際のサプライヤー情報を返しますテーブルのs、およびcを使用しました)

select s.* 
from Suppliers s 
inner join Suppliers c 
    ON s.Country = c.Country 
WHERE c.CompanyName = 'Nord-Ost-Fisch Handelsgesellschaft mbH' 
AND s.CompanyName <> 'Nord-Ost-Fisch Handelsgesellschaft mbH' 

フィルタリングするテーブルフィールドを特定するだけです。

それとも、あなたが好きなら、あなたは参加の一環として、Cにフィルタをかけることができます:

select s.* 
from Suppliers s 
inner join Suppliers c 
    ON s.Country = c.Country 
    AND c.CompanyName = 'Nord-Ost-Fisch Handelsgesellschaft mbH' 
WHERE s.CompanyName <> 'Nord-Ost-Fisch Handelsgesellschaft mbH' 
+0

両方ありがとうございます。 =と<>を使って2つのテーブルで同じ列を使用することは考えたことがありません。 – SgtOVERKILL

+1

2つの全く異なるテーブルを結合しようとするのが最も簡単な方法です。 WHERE、SELECTの中で結合)は、1つの表または他の表から明示的です。 – BradC

関連する問題