【问题标题】:INNER JOIN with Data Exits Condition带有数据退出条件的 INNER JOIN
【发布时间】:2013-12-10 00:02:35
【问题描述】:

我正在编写查询以从两个表 Products 和 ProductsImages 中获取数据。 我的查询是:

    SELECT p.*, pi.*
    FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductId, ProductPrice 
    ORDER BY ProductId) AS row_number FROM Products ) p
    INNER JOIN ( SELECT *, ROW_NUMBER() 
     OVER (PARTITION BY ProductId, ImageId,ImagePath  
    ORDER BY ImageId) AS row_number FROM ProductsImages ) pi 
    ON  p.ProductId = pi.ProductId
    AND p.row_number = pi.row_number
    Where p.ProductId='131';

我必须编写一个运行 INNER JOIN 的条件,即:如果 ProductsImages 有提供 productId 的图像,则执行 INNER JOIN否则它应该在没有加入的情况下运行。并且只显示除图片之外的产品详细信息。如果 productsImages 没有任何图片,则此查询不会显示产品详细信息,例如名称和价格。
限制:我只需要实现 INNER JOIN。 请帮助我并指导我在这种情况下如何实现 if-exits 条件。谢谢

【问题讨论】:

标签: c# asp.net sql query-optimization


【解决方案1】:

在这种情况下你为什么不写left join,

左连接保留产品表中的所有记录,即使是与图像表不匹配的记录

 SELECT p.*, pi.*
    FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductId, ProductPrice 
    ORDER BY ProductId) AS row_number FROM Products ) p
    LEFT OUTER JOIN ( SELECT *, ROW_NUMBER() 
     OVER (PARTITION BY ProductId, ImageId,ImagePath  
    ORDER BY ImageId) AS row_number FROM ProductsImages ) pi 
    ON  p.ProductId = pi.ProductId
    AND p.row_number = pi.row_number
    Where p.ProductId='131';

【讨论】:

  • 我的任务/任务/要求是仅使用内部连接。在问题描述中也进行了编辑..
  • 返回左连接。 可能是它唯一的 CPU 成本更低的解决方案。谢谢帮助。 :)
【解决方案2】:

你可以试试内查询的方式。示例:

SELECT p.*, ( SELECT *, ROW_NUMBER() 
OVER (PARTITION BY ProductId, ImageId,ImagePath  
ORDER BY ImageId) AS row_number FROM ProductsImages pi WHERE p.ProductId = pi.ProductId AND p.row_number = pi.row_number )
FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductId, ProductPrice 
ORDER BY ProductId) AS row_number FROM Products ) p
Where p.ProductId='131';

这里没有加入。 :(

【讨论】:

  • 感谢帮助。我回到左连接,因为它给出了错误 “当子查询没有与 EXISTS 一起引入时,选择列表中只能指定一个表达式。”
  • 如果您可以在 Sql Fiddle 中附加代码,那么我可以更正查询。当表不存在时,很难编写完美的查询。 ;)
猜你喜欢
  • 2011-05-03
  • 2020-06-15
  • 2013-01-31
  • 2012-04-02
  • 2012-01-25
  • 1970-01-01
  • 2016-09-20
  • 2016-01-15
  • 2017-05-07
相关资源
最近更新 更多