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

如何通过一次查询获得产品及其产品变体?

编辑:

期望的结果:

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

您将希望在其上加入这两个表Id = MasterId

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

请参阅带有演示的 SQL Fiddle

ALEFT JOIN将返回所有products,即使它们在表中没有相应的记录ProductVariants

AnINNER 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 表上进行查询,但这会很慢)。

如果您想要没有变体的产品,您可以使用 LEFT OUTER JOIN

为了满足您更新的要求,类似这样的东西(未经测试,请原谅任何错别字)

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 回答