从两个表中获取匹配的属性

时间:2012-02-08 12:44:17

标签: sql oracle

我有两张桌子看起来像这样:

       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查询中实现此结果的最有效方法是什么?

非常感谢每一位帮助。如果我没有表达足够清楚的话,我可以为进一步的问题提供答案。

1 个答案:

答案 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将正确处理空值比较,而不必测试空值)