左外联接,无重复行

时间:2020-04-22 15:33:58

标签: sql sql-server

经过大量搜索后,我无法解决问题。我有以下表格:

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”表中找不到类似的记录,我们将没有任何记录。而我们应该从“产品”表中获得记录,而其他表中的列为空。

请帮助我,谢谢。

3 个答案:

答案 0 :(得分:2)

我认为问题在于条件在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)

答案 1 :(得分:1)

 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

虽然上述查询应能达到您想要的结果-一条商品的价格为mini_product_price(如果存在)和最低product_barcode(如果存在)的商品。

我只是假设您要根据正在编写的查询来执行此操作。您需要花更多时间思考您要回答的问题。

如果其中一张表中每个联接键有多个条目,则联接将使结果成倍增加。

答案 2 :(得分:0)

只需记住以下图表:

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
...