Получение совпадающих атрибутов из двух таблиц - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть две таблицы, которые выглядят так:

       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_attr, значение), аналогичных структуре таблицы A). Цель состоит в том, чтобы проверить, соответствует ли запись в таблице A какой-либо записи в таблице B (одной или более). Одна запись соответствует другой, когда каждый атрибут, существующий в таблице B под одним идентификатором, совпадает с похожими атрибутами в таблице A. Кроме того, в таблице A значения могут быть NULL, но в таблице B нет.

В приведенном выше примере мой запрос должен возвращать «1», поскольку только записи с идентификатором 1 полностью соответствуют аналогичным записям в таблице A. Идентификатор 2 не совпадает, поскольку в таблице значение атрибута 4 равно NULL и оно имеет атрибут которого нет в таблице A. Идентификатор 3 также не совпадает, даже если атрибут 3 похож, но атрибут 1 не совпадает.

Как видно, для достижения соответствия не все записи, существующие в таблице A, должны совпадать, но если атрибут существует в таблице B, то его значение должно совпадать со значением, аналогичным значению в таблице A.

Каков наиболее эффективный способ достижения этого результата в запросе Oracle?

Любая помощь будет принята с благодарностью. Я могу дать ответы на дальнейшие вопросы, если я недостаточно четко выразил свое мнение.

1 Ответ

3 голосов
/ 08 февраля 2012

Вы можете попробовать следующее:

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 и флаг, указывающий, в порядке ли этот идентификатор.

(Обратите внимание, что Decode должным образом позаботится о сравнении нулевых значений без проверки на нулевые значения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...