我有两张桌子看起来像这样:
A B
id_attr value id id_attr value
-------------- -------------------
1 a 1 2 b
2 b 1 3 c
3 c 2 2 b
4 NULL 2 4 d
2 5 e
3 1 aaa
3 3 c
表A是我的参考表,我在表B中有多个条目。(具有相同id的每个条目组成对(id_attr,value)与表A的结构类似)。目标是检查表A中的条目是否与表B中的任何条目匹配(一个或多个)。当一个id下的表B中存在的每个属性与表A中的类似属性匹配时,一个条目匹配另一个条目。此外,在表A中,值可以是NULL,但是在表B中不是。
在上面的示例中,我的查询应该返回“1”,因为只有id为1的条目完全匹配表A中的类似条目.Id 2不匹配,因为表中属性4的值为NULL并且它具有属性在表A中不存在。即使属性3类似,但属性1不匹配,Id 3也不匹配。
正如您所看到的,为了实现匹配,表A中存在的每个条目都不应该匹配,但如果表B中存在属性,那么它的值必须与表A中的相似值匹配。
在Oracle查询中实现此结果的最有效方法是什么?
非常感谢每一位帮助。如果我没有表达足够清楚的话,我可以为进一步的问题提供答案。
答案 0 :(得分:3)
您可以尝试以下操作:
SELECT ID, MIN(IS_OK) FROM
(
SELECT B.ID ID,
DECODE(B.VALUE, A.VALUE, 'Y', 'N') IS_OK
FROM A INNER JOIN B
ON B.ID_ATTR = A.ID_ATTR
)
GROUP BY ID;
这将返回B的ID和一个标志,指示此ID是否正常。
(注意Decode将正确处理空值比较,而不必测试空值)