2016-08-23 7 views
0

enter image description hereSQL初級:2つのテーブル(+グループ+発注)から取得項目

私は(VirtueMartを使用して)電子商取引のウェブサイトを持っていると私は子製品から構成された製品を販売しています。プロダクトが親である場合、子はそれを参照している間は、ParentIDを持たない。私は知っている、最高のロジックではなく、私はそれを作成していない。

私のSQLは非常に基本的であり、私は私が子供を持って

  • 選択した製品を達成するために非常に簡単に何かを頼むと考えています。
  • 価格(ASC/DSC)で結果を並べ替えます。
+1

あなたは[存在](http://www.w3resource.com/sql/special-operators/sql_exists.php)オペレータを必要とする –

+0

あなたのdbにタグを付けてください。 – ceving

+0

あなたは[tag:common-table-expression]を使って[tag:recursive-queries]を探しています(そして、本当に**ゼロの代わりに 'NULL'を使って親なしで行を識別すべきです。 'あなたの製品テーブルに適切な外部キー制約を設定することはできません) –

答えて

1

この表のデザインは、いくつかの理由から定かではありません。まず、値0は親の欠如を示すために使用されているように見えます(製品にIDがないため)。通常、これは代わりにNULL値になります。

それがNULL値だった場合は、親なしですべてを取得するためのSQL文は、このような単純なものですが:

SELECT * FROM Products WHERE ParentID IS NULL 

しかし、我々はそれを行うことはできません。我々は0 =なし親が、我々はこれを行うことができますという仮定をした場合:

SELECT * FROM Products WHERE ParentID = 0 

しかし、それは作るために危険な仮定です。このように、(上記のスキーマ与えられた)これを行うための正しい方法は、2つのテーブルを比較し、PARENTIDが商品コードとして存在することを確認するために、次のようになります。

SELECT a.* 
FROM Products AS a 
WHERE EXISTS (SELECT * FROM Products AS b WHERE a.ID = b.ParentID) 

次に、価格設定を得るために、私たちは参加する必要がありそれらの2つのテーブルを共通のIDでまとめます。価格表には、商品コードを参照しているようだ、私たちはそうのようなものを使用することができたよう:

あなたが示されてきたデータごとに十分であるかもしれない
SELECT p.ProductID, p.ProductName, pr.Price 
FROM Products AS p INNER JOIN Prices AS pr ON p.ProductID = pr.ProductID 
WHERE EXISTS (SELECT * FROM Products AS b WHERE p.ID = b.ParentID) 
ORDER BY pr.Price 

を、通常のテーブル構造のタイプは、それがより多くのを持つことが可能だということを示しています製品に関連付けられている1つの価格よりも優れています(クイックスナップショットに基づいてこれが真であるかどうかはわかりません)。

もう少しお待ちいただければ幸いです。詳細が必要な場合は、さらに詳しくお尋ねします。

0

あなたはself-joinを使用する必要があります:

例えば:

SELECT * FROM products parent 
JOIN products children ON parent.id = children.parent_id 
JOIN prices ON prices.product_id = children.id 
ORDER BY prices.price 

我々はそれが子を持​​たないすべてのエントリを除外しますJOINを使用しているため。

私はそれをテストしていない、私はうまくいくことを願っています。

1

SELECT * FROM Products INNER JOIN Prices ON Products.ProductID = Prices.ProductID ORDER BY Products.Price [ASC/DSC]

説明:

SELECT - (取得/取得)

*を選択 - ALL

FROM Products - DBテーブルの名前 "製品" からそれらを取得します。

INNER JOIN Prices - 両方のテーブルの列が一致する限り、両方のテーブルのすべての行を選択します。むしろ、JOIN DBテーブル "製品"とDBテーブル "価格"。

ON - WHEREのように、一致するかどうかを確認する行を定義します。

Products.ProductID = Prices.ProductID - あなたの一致基準。 DBテーブル "製品"と "価格"の両方に "ProductID"が存在する行を取得します。

ORDER BY Products.Price [ASC/DSC] - ソート。昇順にはASC、降順にはDSCを使用します。

1

ssmsを使用している場合は、以下のスクリプトを使用してください。

SELECT pd.ProductId,ProductName,Price 
FROM product pd 
LEFT JOIN price pr ON pd.ProductId=pr.ProductID 
WHERE EXISTS (SELECT 1 FROM product pd1 WHERE pd.productID=pd1.ParentID) 
ORDER BY pr.Price ASC 

注:親製品のいずれも価格表に価格がありません。あなたの子供の製品の価格の合計が下のスクリプトを使用したい場合。

SELECT pd.ProductId,pd.ProductName,SUM(ISNULL(pr.Price,0)) SUM_ChildPrice 
FROM product pd 
LEFT JOIN product pd1 ON pd.productID=pd1.ParentID 
LEFT JOIN price pr ON pd1.ProductId=pr.ProductID 
GROUP BY pd.ProductId,pd.ProductName 
ORDER BY pr.Price ASC 
関連する問題