0

我在为 Oracle 编写 join 语句时遇到了一些问题。我想我想使用左连接,但我不是 100% 确定。

这是我的两张桌子

**VisibilityTable**
Industry
ProductID
Visibility
etc

**ItemTable**
ProductID
Other Info
etc

这就是问题所在。我有大约 15 个行业。每个行业都希望能够根据自己的喜好将产品(~15000)标记为公共或私有。当您想要查看设置为公共或私有的特定行业的产品时,我可以使用该查询。

我遇到的问题是在一个产品被标记为一个行业的公共或私有之后,它不再出现在它尚未标记的行业中。到目前为止,这是我的查询:

SELECT v.*, NVL(b.VISIBILITY,'Not Marked') Visibility 
FROM ItemTable v 
LEFT OUTER JOIN VisibilityTable b ON b.ProductID = v.ProductID
WHERE (
(v.STATUS LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.MODEL LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.DUTY LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.CERTIFICATION LIKE 'Filter' or 'Filter' LIKE 'All')
)

这可以让我获得标记为“未标记”、“私人”、“公共”的项目,但我无法让它撤回在所选行业中未标记的项目。

编辑:添加了完整的 where 子句。这是动态生成的,然后根据来自配置文件的值传入。

例如,ProductID 85322 已标记为 Private for Industry EPGBio,但当我选择 Industry EPGMethane 时,它​​不会显示为“未审核”。它显示为标记为私有。

4

1 回答 1

2

我认为这是因为您正在过滤掉未出现在 where 子句中的结果。

当您在 where 子句中引用“b”表时,您将隐式更改left outer joininner join. (除非你碰巧在做is null。)

将条件移到on子句中。

我想我终于明白了。您试图区分为b.VisibilityNULL 和不存在的记录。为此,您需要一个case声明:

select v.*,
       (case when b.ProductId is null then 'Not Marked at All'
             when b.Visibility is null then 'Marked as NULL'
             else b.Visibility'
        end) as Visibility

我更改了生成的字符串以明确发生了什么。你可以随心所欲地制作它们。关键是利用join key上的条件判断记录是否存在,然后看value,判断value是否存在。

于 2013-02-26T17:10:15.383 回答