【发布时间】:2021-02-15 17:25:27
【问题描述】:
我有以下 SQL 选择语句,用于获取产品或葡萄酒的子集:
SELECT pv.SkProdVariantId AS id,
pa.Colour AS colour,
FROM Dim.ProductVariant AS pv
JOIN ProductAttributes_new AS pa
ON pv.SkProdVariantId = pa.SkProdVariantId
WHERE pv.ProdTypeName = 'Wines'
生成的这个表的长度是 3,905。我想获取这些产品的所有交易数据。 目前我正在使用这个 select 语句
SELECT c.CalDate AS timestamp,
f.SkProductVariantId AS sku_id,
f.Quantity AS quantity
FROM fact.FTransactions AS f
LEFT JOIN Dim.Calendar AS c
ON f.SkDateId = c.SkDateId
LEFT JOIN (
SELECT pv.SkProdVariantId AS id,
pa.Colour AS colour,
FROM Dim.ProductVariant AS pv
JOIN ProductAttributes_new AS pa
ON pv.SkProdVariantId = pa.SkProdVariantId
WHERE pv.ProdTypeName = 'Wines'
) AS s
ON s.id = f.SkProductVariantId
WHERE c.CalDate LIKE '%2019%'
日历日期正确,但返回的独特产品数量为 5,648,而不是 select 查询中预期的 3,905。
为什么我在第一个选择查询中的LEFT JOIN 没有像我预期的那样工作?
感谢您的帮助!
【问题讨论】:
-
如果连接中匹配的行数> 1,则左连接将重复行
-
@Charlieface 这就是我所期望的,因为可能有许多交易与一种产品相关联。但是,我看到第二个表中有更多的唯一 SKU ID,而第一个表中肯定是不正确的?
-
您正在选择 2019 年的所有交易。
LEFT JOIN Dim.Calendar确实是INNER JOIN Dim.Calendar,因为使用WHERE c.CalDate LIKE '%2019%'您可以忽略所有外部连接行(如果存在,我对此表示怀疑)。然后你外部加入葡萄酒信息。结果,您将获得 2019 年的所有交易,而葡萄酒交易将获得额外的葡萄酒信息。
标签: sql sql-server join