【问题标题】:exclude some rows from my outer join result set从我的外部连接结果集中排除一些行
【发布时间】:2019-01-12 04:33:59
【问题描述】:

我有一张名为 products 的表,另一张名为 prices。

现在我正在尝试显示所有有价格和没有价格的产品,所以我使用左连接。到目前为止一切顺利。

select * from products,prices where products.id = prices.id(+)

价格表也有 validFromvalidTo 记录。我现在想要实现的是排除过期的记录(前两行)。当我使用左连接时这可能吗

这是查询的结果。

结果集:

SELECT *
FROM   products
       LEFT JOIN prices
            ON   products.id = prices.id
                 AND (prices.validfrom >= sysdate
                      OR prices.validfrom IS NULL)
                 AND (prices.validto < sysdate
                      OR prices.validto IS NULL);

我明白了

然而,预期的结果应该是:

【问题讨论】:

  • 在您的预期结果中缺少桌子和椅子。但那是products 中的产品,不是吗?所以左连接包括它们。要排除它们,您可能需要一个内部连接(将 LEFT 更改为 INNER)。但这改变了问题的前提。
  • 好的——我想我现在明白了。还有一个问题:如果在我只想显示产品“笔记本电脑”的实际下面添加另一个 where 子句,为什么我仍然得到 7 行?
  • 实际上你应该得到除了笔记本电脑以外的任何其他记录。但是如果不知道实际的查询,我就无法判断...但是在这个问题完全发生变化之前,我建议您就这个问题提出一个新问题,并在WHERE 中显示您的查询以及附加条件。
  • 了解左连接返回的内容:行上的内连接以及由空值扩展的不匹配左表行。作为左连接的一部分,始终知道您想要什么内连接。 PS您可能想要加入后的位置。但是请用文字描述您想要的输出如何是您输入的函数——而不仅仅是一个例子。请阅读minimal reproducible example 并采取行动。包括剪切&粘贴&可运行的文本/输入/输出。
  • 你能给我们看一下带有列名的表格,以便我知道哪个是加入列吗???

标签: sql oracle outer-join


【解决方案1】:

最好使用内连接,而不是左外连接;

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT * FROM (select * from products,prices where products.id = prices.id(+)) WHERE (prices.validTo IS NULL OR prices.validTo > sysdate)  
    

    【讨论】:

      【解决方案3】:

      ON 子句中添加一个检查,即prices.validfrom &lt;= sysdate AND prices.validto &gt; sysdate

      SELECT *
             FROM products
                  LEFT JOIN prices
                            ON products.id = prices.id
                               AND (prices.validfrom <= sysdate
                                     OR prices.validfrom IS NULL)
                               AND (prices.validto > sysdate
                                     OR prices.validto IS NULL);
      

      您还应该使用明确的LEFT JOIN 语法,而不是那种古老的WHERE ... (+) 语法。

      【讨论】:

      • 出于某种原因,如果我这样做,我现在得到 7 行,其中仅显示左行中的数据,而价格表中没有任何内容。结果应该是 5 行吧?
      • @SassaMoustafa:嗯,我忘了处理有效期为空的情况。但这不会导致显示更多数据,而是显示更少。无论如何,请考虑发布示例数据和期望的结果与该示例数据一起澄清。
      • @SassaMoustafa:我猜 Gordon(谢谢!)是对的,我混淆了比较的方向......再试一次。
      • 是的 - 我知道必须处理空值(为此做了一个 nvl)。如果再想一想,我的目标不是显示过期的价格,因此不应该对其进行过滤(因为它们已过期)。由于左连接,是否只有 7 行?
      • @SassaMoustafa:LEFT JOIN 左表中的所有内容都在结果中,即使条件不匹配也是如此。因此,如果您有 7 种产品,您将获得(至少)7 行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多