【发布时间】:2019-01-12 04:33:59
【问题描述】:
我有一张名为 products 的表,另一张名为 prices。
现在我正在尝试显示所有有价格和没有价格的产品,所以我使用左连接。到目前为止一切顺利。
select * from products,prices where products.id = prices.id(+)
价格表也有 validFrom 和 validTo 记录。我现在想要实现的是排除过期的记录(前两行)。当我使用左连接时这可能吗
这是查询的结果。
结果集:
有
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