左外侧加入无重复行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左外侧加入无重复行相关的知识,希望对你有一定的参考价值。

经过大量的搜索,我无法解决我的问题。我有以下的表,我想从我的 "产品 "表中选择所有记录。

enter image description here

我想选择 "产品 "表中的所有记录 但我有个问题: 当我执行下面的查询时,我从 "产品 "表中得到了多条记录。

  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条目。

我只是根据你所写的查询假设你想要这个结果。你需要花更多的时间去思考你想回答的问题。

如果在其中一个表中,每个连接键有一个以上的条目,那么连接将使你的结果倍增。

另一答案

只要记住这张图就可以了。

enter image description here

当你调用 LEFT JOIN 并像左上角第二张图那样应用过滤功能,你将只得到属于 A 表。

我想从我的 "产品 "表中选择所有记录,但我有一个问题。当我执行下面的查询时,我从 "产品 "表中得到了多条记录。

你可以试着调用 DISTINCT 之后 SELECT,像这样。

SELECT DISTINCT dbo.product.id, dbo.product.name, dbo.product_price.value
          dbo.product_barcode.barcode
...

以上是关于左外侧加入无重复行的主要内容,如果未能解决你的问题,请参考以下文章

如何创建片段以重复变量编号中的代码行

LeetCode/无重复字符最长子串

在Birt报告中获取左边的重复行

LEETCODE 003 找出一个字符串中最长的无重复片段

左加入Java中的2个对象列表[重复]

如何在r中左加入[重复]