2017-07-31 12 views
0

私は、在庫のある商品のみを返す2つのテーブルのデータを使用してSelect文を作成しようとしていましたが、問題があります。 私は2つのテーブルを持っています。 1つはプロダクト、もう1つはオーダーです。製品内のデータは静的です。左の数量に基づいて行を選択する方法

のテーブルは、これらの線

create table Products (ProductID integer, TotalQuantity integer); 
insert into Products values (1, 1); 
insert into Products values (2, 2); 
insert into Products values (3, 20); 
insert into Products values (4, 10); 
insert into Products values (5, 20); 
insert into Products values (6, 10); 
insert into Products values (7, 5); 
insert into Products values (8, 50); 
insert into Products values (9, 1); 

create table Orders (OrderID integer, ProductID integer, Amount integer); 
insert into Orders values (6, 4, 1); 
insert into Orders values (6, 6, 1); 
insert into Orders values (6, 1, 1); 
insert into Orders values (47, 4, 1); 
insert into Orders values (6, 9, 1); 
insert into Orders values (5, 7, 1); 
insert into Orders values (6, 2, 2); 

とテーブルを使用して作成され、これは私が

製品テーブル Products table

注文表 Orders table

より見やすい場合(このように見えます次のクエリで部分的に成功しました

SELECT p.ProductID, p.TotalQuantity 
FROM Products p 
JOIN Orders o 
ON o.ProductID = p.ProductID 
GROUP BY p.ProductID, o.Amount, p.TotalQuantity 
HAVING SUM(o.Amount) < p.TotalQuantity 

しかし、注文された製品の結果のみが返されます。 HAVE'NTは含まれていません(id 3、5、8の製品を入手する必要があります)。

2つの選択クエリを1つにまとめることができますが、私はどのように注文商品を入手するのか分かりません。

SELECT p.ProductID, p.TotalQuantity 
FROM Products p 
JOIN Orders o 
ON o.ProductID != p.ProductID 

これは期待値を返しません。

あなたの方法については
+0

使用しているデータベースで質問にタグを付ける必要があります(ただし、この場合は答えには影響しません)。 –

答えて

3

、あなたはLEFT JOINを続行することができます

SELECT p.ProductID, p.TotalQuantity 
FROM Products p LEFT JOIN 
    Orders o 
    ON o.ProductID = p.ProductID 
GROUP BY p.ProductID, o.Amount, p.TotalQuantity 
HAVING COALESCE(SUM(o.Amount), 0) < p.TotalQuantity; 

別の方法を、これはWHERE句で相関サブクエリとなり書くこと:多くの状況下では

SELECT p.* 
FROM Products p 
WHERE p.TotalQuantity > (SELECT COALESCE(SUM(o.Amount), 0) 
         FROM Orders o 
         WHERE o.ProductID = p.ProductID 
         ); 

(すなわちインデックスはOrders(ProductID, Amount))、すべてのデータを一度に集計する必要がないため、パフォーマンスが向上します。

+0

2番目の例では、最初のケースと同じ結果を得るためにどこかで合体を使用する必要がありますか? 'SELECT COALESCE(SUM(o.Amount)、0)' – NulisDefo

+0

@NulisDefo。 。 。良いキャッチ。 –

+0

2番目の例がどのように正確に動作するかを説明してもらえますか?私は前にCOALESCEと出会ったことはありません。そして、この場合、私は少し混乱しているようです。第2の照会計算合計は、各p.ProductIDを通過し、第1の照会と比較される。それがp.ProductID = 3に達すると、o.ProductIDには同等物がありません。つまり、結果がNULLであるため、代わりに何らかの結果(つまり0)があるように変更し、そのゼロをp.TotalQuantityと比較します.p.ProductID = 3私は正しく理解していますか? @NulisDefo。 – NulisDefo

0

結果を達成するための方法のカップル。 ONの後にWHERE句を追加すると、SQLにTotalQuantityが0より大きい部分のみが返されるようになります。

また、p.TotalQuantity> 0をON文に追加することもできます。

+0

常にTotalQuantity> 0です。TotalQuantityは、まだ送信されていない製品の数を表します – NulisDefo

関連する問題