0

私は次のデータベース構造を持っています:

`Products`
-------------------------------------
ID | ProductNo
-------------------------------------
1 | 3340
2 | 3450


`ProductVariants`
-------------------------------------
ID | MasterID (ref to `Products`.`ID`) | ProductNo
-------------------------------------
1 | 1 | 3341
2 | 1 | 3342
3 | 2 | 3451

1つのクエリで製品とその製品バリアントを取得するにはどうすればよいですか?

編集:

望ましい結果:

MasterID | IsMaster | ProductNo | VariantProductNo
1 | 1 | 3340 | null
1 | 0 | 3340 | 3341
1 | 0 | 3340 | 3342
2 | 1 | 3450 | null
2 | 0 | 3450 | 3451
4

2 に答える 2

3

あなたは彼らの2つのテーブルを結合したいと思うでしょうId = MasterId

select *
from products p
left join ProductVariants v
  on p.id = v.Masterid

SQL FiddlewithDemoを参照してください

テーブルに対応するレコードがない場合でも、ALEFT JOINはすべてを返します。productsProductVariants

は、両方のテーブルに表示されるINNER JOINレコードを返します。

これは、結合構文の学習に役立つ結合の視覚的な説明です。

結合するテーブルがさらにある場合は、次を使用します。

select *
from products p
left join ProductVariants v
  on p.id = v.Masterid
left join MasterArtikel m
  on v.MasterId = m.MasterId  -- you place the columns that join the tables here
于 2013-01-10T11:48:51.923 に答える
1

これはそれをします

SELECT *
FROM Products
INNER JOIN ProductVariants
ON Products.ID = ProductVariants.MasterID

通常、効率を上げるために単一のクエリで実行されます(Productsテーブルでクエリを実行し、その結果をループして、それぞれに対してProductVariantsテーブルでクエリを実行できますが、処理が遅くなります)。

バリエーションのない商品が必要な場合は、代わりにLEFTOUTERJOINを使用できます。

更新された要件に対応するには、次のようなものを使用します(テストされていないため、タイプミスを許してください)

SELECT Products.MasterID, 1 AS IsMaster, Products.ProductNo, NULL AS VariantProductNo
FROM Products
UNION
SELECT Products.MasterID, 0 AS IsMaster, Products.ProductNo, ProductVariants.VariantProductNo
FROM Products
INNER JOIN ProductVariants
ON Products.ID = ProductVariants.MasterID
ORDER BY MasterID, IsMaster DESC, ProductNo
于 2013-01-10T11:51:48.660 に答える