Sql 从外部联接结果集中排除某些行

Sql 从外部联接结果集中排除某些行,sql,oracle,outer-join,Sql,Oracle,Outer Join,我有一张表叫产品,另一张表叫价格 现在我试图展示所有有价格和无价格的产品,所以我使用左连接。到目前为止还不错 select * from products,prices where products.id = prices.id(+) 价格表也有一个从到的有效记录和一个到的有效记录。我现在想要实现的是排除过期记录(前两行)。当我使用左连接时,这可能吗 这是查询的结果 结果集: 与 选择* 来自产品 左键连接价格 ON products.id=prices.id 和(prices.validf

我有一张表叫产品,另一张表叫价格

现在我试图展示所有有价格和无价格的产品,所以我使用左连接。到目前为止还不错

select * from products,prices where products.id = prices.id(+)
价格表也有一个从到的有效记录和一个到有效记录。我现在想要实现的是排除过期记录(前两行)。当我使用左连接时,这可能吗

这是查询的结果

结果集:

选择*
来自产品
左键连接价格
ON products.id=prices.id
和(prices.validfrom>=sysdate
或prices.validfrom为空)
和(prices.validto
我明白了

然而,预期结果应该是:

子句的上添加一个从sysdate到
prices.validf的检查

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);
选择*
来自产品
左键连接价格
ON products.id=prices.id
和(prices.validfrom sysdate)
或prices.validto为空);
您还应该使用显式的
左连接
语法,而不是古老的
WHERE。。。(+)
东西。

试试这个:

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

你最好使用内部连接,而不是外部连接

出于某种原因,如果我这样做的话,我现在得到7行,其中只显示我左边行中的数据,而价格表中没有任何数据。结果应该是5行,对吗?@SassaMoustafa:嗯,我忘了处理有效期为空的情况。但这不会导致更多的数据被显示,而是更少。无论如何,请考虑将样本数据和期望的结果用样本数据来澄清。@ SassaMoustafa:我猜戈登(谢谢!)做对了,我把比较的方向弄糊涂了…再试一次。是的-我知道必须处理空值(为此做了nvl)。如果再想一想,我的目标是不显示过期的价格,因此不应对其进行过滤(因为它们已过期)。因为左连接,只有7行吗?@SassaMoustafa:a
左连接的左表中的所有内容都在结果中,即使条件不匹配。所以,如果你有7个产品,你会得到(至少)7行。在你的预期结果中,桌子和椅子都不见了。但是这些都是
产品中的产品,不是吗?所以左连接包括它们。要排除它们,您可能需要一个内部联接(将
LEFT
更改为
internal
)。但这改变了问题的前提。好吧,我想我现在明白了。还有一个问题:如果在我只想显示产品“Laptop”的下面的实际一行中添加另一个where子句,为什么我仍然得到7行?实际上,你应该得到除Laptop之外的任何其他记录。但是如果不知道实际的问题,我就说不出来。。。但是,在这个问题完全改变之前,我建议您提出一个关于这个问题的新问题,并在
的WHERE
中显示带有附加条件的查询。了解左连接返回的内容:行的内部连接加上由null扩展的不匹配的左表行。始终知道作为左连接的一部分,您需要什么样的内部连接。PS加入后,您可能需要一个where。但是请用文字描述一下你想要的输出是如何成为你输入的函数的,而不仅仅是一个例子。请阅读并采取行动。包括剪切、粘贴和可运行文本/输入/输出。您能给我们看一个列名称的表吗?这样我就可以知道哪一个是连接列的???
SELECT * FROM (select * from products,prices where products.id = prices.id(+)) WHERE (prices.validTo IS NULL OR prices.validTo > sysdate)