Как проверить, существует ли конкретный идентификатор в нескольких таблицах, а какие - в Oracle?

У меня есть таблица с именем persons, первичный ключ которой pid, чем у меня есть 3 разных таблицы (назовем их A, B и C), где pid - внешний ключ.

Мне нужно знать, существует ли конкретный pid в любой из этих таблиц и в какой именно из них.

Я не знаю, достижимо ли это с помощью одного запроса, но я думаю, что функция будет работать лучше в моем конкретном случае, чтобы я мог сделать это:

SELECT pid, name, sex, func_name(pid) my_str
FORM persons
WHERE pid = 5

А затем, в зависимости от таблиц, в которых найден pid, my_str будет выглядеть примерно так:

B | C

Значение pid = 5 было найдено в таблицах B и C.

Я мог бы сделать это с помощью 3 SELECT в функции, используя COUNT (*). Если результат> 0, значит pid = 5 был найден в таблице из соответствующего SELECT. Но это кажется глупым способом сделать это, предложения?


person rfgamaral    schedule 27.12.2010    source источник


Ответы (2)


Может ли вам помочь что-то вроде следующего? Я просто добавил case / whens, чтобы показать вам, как вы можете проверить наличие в других таблицах.

select p.pid
      ,p.name
      ,p.sex
      ,case when a.pid = p.pid then 'Yes' else 'No' end as in_a
      ,case when b.pid = p.pid then 'Yes' else 'No' end as in_b
      ,case when c.pid = p.pid then 'Yes' else 'No' end as in_c
  from persons p
  left outer join a on (a.pid = p.pid)
  left outer join b on (b.pid = p.pid)
  left outer join c on (c.pid = p.pid)
 where p.pid = 5;
person Ronnis    schedule 27.12.2010
comment
Это почти работает. Он возвращает кучу записей с точно такими же значениями, и мне нужна только одна. Пытался использовать GROUP BY на pid, но это не сработало. - person rfgamaral; 28.12.2010

Улучшение ответа @Ronnis (я не тестировал, но надеюсь, что что-то вроде этого сработает. Если нет, простите меня за поздний час :))

select p.pid,
       p.name,
       p.sex,
       case when a.pid = p.pid then 'A' else '' end |
       case when b.pid = p.pid then 'B' else '' end |
       case when c.pid = p.pid then 'C' else '' end
  from persons p
  left outer join a on (a.pid = p.pid)
  left outer join b on (b.pid = p.pid)
  left outer join c on (c.pid = p.pid);
person Ilya Kogan    schedule 27.12.2010