2017-11-30 16 views
0

したがって、すべての製品が廃止されている場合に限り、企業情報を返す作業があります。一致する列の値を持つ行のみを選択する

私はSuppliersProductsテーブルを持っています。 SuppliersテーブルはProductIDカラムを持ち、Productsテーブルはビットを格納するProductIDDiscontinuedカラムを持ちます(1が真、0が偽)。

誰かがこれに対する解決策を持っているなら、それは救命救助者になるでしょう。

編集:私が働いているクエリは、この

select 
    s.CompanyName, p.ProductName, p.Discontinued 
from 
    Suppliers s 
join 
    Products p on s.SupplierID = p.SupplierID 

ようなものになるだろうし、出力はこの

CompanyName     ProductName Discontinued 
------------------------------------------------------------- 
Exotic Liquids    Chai    0 
Exotic Liquids    Chang    0 
Exotic Liquids    Aniseed Syrup  0 
New Orleans Cajun Delights Chef Anton's Cajun Seasoning 0 
New Orleans Cajun Delights Chef Anton's Gumbo Mix 1 
Grandma Kelly's Homestead  Grandma's Boysenberry Spread 0 
Grandma Kelly's Homestead  Uncle Bob's Organic Dried Pears 0 
Grandma Kelly's Homestead  Northwoods Cranberry Sauce 0 
Tokyo Traders     Mishi Kobe Niku  1 
Tokyo Traders     Ikura    0 

ようなものになるだろうが、私はそれだけはとサプライヤーを返すようにしたいですすべて廃止された製品

+0

企業テーブルのスキーマは何ですか? –

+0

@ YogeshSharma私はいくつかの例を追加しました – brendan612

答えて

0

私はここで外に出ていますが、ProductIDに2つのテーブルをジョインしようとしていると思います。

そのような場合、あなたはSQLクエリは次のようになります。

SELECT a.ProductID, b.Discontinued FROM Suppliers a 
LEFT JOIN Products b ON (a.productID = b.productID) 
WHERE b.Discontinued = true 
+0

少しうまく説明するためにいくつかの例を追加しました。私はあなたが示唆しているものを試してみるつもりです。 – brendan612

+0

私はタイプミスを訂正しました。第2の「b.Discontinued」 – dockeryZ

0
select Suppliers.SupplierID, CompanyName from Suppliers 
inner join Products on 
Products.SupplierID = Suppliers.SupplierID 
where Discontinued = 1 
and Products.SupplierID not in 
(select SupplierID from Products where Discontinued = 0) 
group by Suppliers.SupplierID, CompanyName 
0

は、使用するすべての言語で、より良い開発者になります。一度に何かをしようとするのを止める。問題を消化してください。良い質問を投稿する方法を学びます。あなたは質問の質問をしています - あなたのスキーマを理解し、それをどのように使用するかを理解することなく、他の人があなたの問題を理解し、有用な提案をどのように提供すると思いますか?確かに - このケースではかなり簡単ですが、テーブルを生成し、サンプルデータを入力し、他の人が応答するように試みたものを含みます。

したがって、最初のステップは「どのサプライ品が廃止された製品のみを提供するか」という質問に答えることです。どうやら、あなたはProductで必要なすべての情報を持っています。何かのように:

select P.SupplierID from dbo.Products as P 
group by P.SupplierID 
having min(cast(P.Discontinued as tinyint)) = 1 
order by P.SupplierID; 

私は正しいと思いますが、それはまだ推測です。場合によっては、ビット列がその名前に反して「使用」されることがあります。それは何ですか? group by句(サプライヤID)によって生成された各グループについて、Discontinuedの最小値が決定されます(最小/最大をビットで使用できないため、キャストが必要です)。すべての中断された製品を含むサプライヤの場合、その列はすべての関連する行に対して1でなければなりません。 1> 0なので、サプライヤーのすべての製品が中止されたことを意味します。グループ化することで、別の行セットも得られます。

異なるSupplierID値セットを生成する方法を知ったので、他のクエリに適用して、それらのサプライヤに関する情報を得ることができます。参加することができます、INを使用する、存在を使用する - あなたは本当にこれを学習体験にしたい場合は、3つすべてを試してください。

関連する問題