左外侧加入无重复行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左外侧加入无重复行相关的知识,希望对你有一定的参考价值。
经过大量的搜索,我无法解决我的问题。我有以下的表,我想从我的 "产品 "表中选择所有记录。
我想选择 "产品 "表中的所有记录 但我有个问题: 当我执行下面的查询时,我从 "产品 "表中得到了多条记录。
SELECT dbo.product.id, dbo.product.name, dbo.product_price.value
dbo.product_barcode.barcode
FROM dbo.product LEFT OUTER JOIN
dbo.product_price ON dbo.product.id = dbo.product_price.product_id LEFT OUTER JOIN
dbo.product_barcode ON dbo.product.id = dbo.product_barcode.product_id
我的问题在下面的查询中得到了解决
SELECT dbo.product.id, dbo.product.name, dbo.product_price.value
dbo.product_barcode.barcode
FROM dbo.product LEFT OUTER JOIN
dbo.product_price ON dbo.product.id = dbo.product_price.product_id LEFT OUTER JOIN
dbo.product_barcode ON dbo.product.id = dbo.product_barcode.product_id
WHERE (dbo.product_price.id IN
(SELECT MIN(id) AS minPriceID
FROM dbo.product_price AS product_price_1
GROUP BY product_id)) AND (dbo.product_barcode.id IN
(SELECT MIN(id) AS Expr1
FROM dbo.product_barcode AS product_barcode_1
GROUP BY product_id))
现在我只有一个问题. 如果 "product_price "表或 "product_barcode "表没有任何记录, 将不会返回任何记录. 我的意思是,如果在'product_price'表或'product_barcode'表中没有类似的记录,我们将不会有任何记录,而我们应该从'product'表中找到记录,而其他表的记录为空。
请帮助我谢谢。
我认为问题在于条件在WHERE子句中--尝试将条件从WHERE子句移到每个连接中。
SELECT dbo.product.id, dbo.product.name, dbo.product_price.value,
dbo.product_barcode.barcode
FROM dbo.product
LEFT OUTER JOIN dbo.product_price ON dbo.product.id = dbo.product_price.product_id
--moved from WHERE clause
AND dbo.product_price.id IN (SELECT MIN(id) AS minPriceID FROM dbo.product_price AS product_price_1 GROUP BY product_id)
LEFT OUTER JOIN dbo.product_barcode ON dbo.product.id = dbo.product_barcode.product_id
--moved from WHERE clause
AND dbo.product_barcode.id IN (SELECT MIN(id) AS Expr1 FROM dbo.product_barcode AS product_barcode_1 GROUP BY product_id)
SELECT dbo.product.id, dbo.product.name, MIN(dbo.product_price.value),MIN( dbo.product_barcode.barcode)
FROM dbo.product
LEFT OUTER JOIN dbo.product_price ON dbo.product.id = dbo.product_price.product_id
LEFT OUTER JOIN dbo.product_barcode ON dbo.product.id = dbo.product_barcode.product_id
GROUP BY dbo.product.id, dbo.product.name
虽然上面的查询应该能达到你想要的结果 -- 有一个最小的product_price(如果存在的话)和最小的product_barcode(如果存在的话)的product条目。
我只是根据你所写的查询假设你想要这个结果。你需要花更多的时间去思考你想回答的问题。
如果在其中一个表中,每个连接键有一个以上的条目,那么连接将使你的结果倍增。
只要记住这张图就可以了。
当你调用 LEFT JOIN
并像左上角第二张图那样应用过滤功能,你将只得到属于 A
表。
我想从我的 "产品 "表中选择所有记录,但我有一个问题。当我执行下面的查询时,我从 "产品 "表中得到了多条记录。
你可以试着调用 DISTINCT
之后 SELECT
,像这样。
SELECT DISTINCT dbo.product.id, dbo.product.name, dbo.product_price.value
dbo.product_barcode.barcode
...
以上是关于左外侧加入无重复行的主要内容,如果未能解决你的问题,请参考以下文章