Как проверить, существует ли конкретный идентификатор в нескольких таблицах и какие в Oracle? - PullRequest
0 голосов
/ 28 декабря 2010

У меня есть таблица с именем 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.Но это кажется глупым способом сделать это, предложения?

Ответы [ 2 ]

1 голос
/ 28 декабря 2010

Хотелось бы что-то вроде следующего?Я просто добавил 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;
0 голосов
/ 28 декабря 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);
...