Определите, существует ли строка для fk в одной из 20 таблиц - PullRequest
0 голосов
/ 16 сентября 2009

Я пытался найти лучший способ, чем многие операторы IF / THEN, определить, содержат ли таблицы ONE или MORE ссылку на ключ forign. Мне просто нужно знать (true / false), существует ли строка в любой из 20 таблиц. Все таблицы имеют одинаковое поле fk.

Надеюсь, это имеет смысл, если нет, я попытаюсь объяснить дальше.

Ответы [ 4 ]

1 голос
/ 16 сентября 2009

Я не уверен, что понимаю вопрос. Будет ли следующее улучшить вашу ситуацию?

if exists(select * from Table1 where ForeignKeyColumn = searchValue)
  or exists(select * from Table2 where ForeignKeyColumn = searchValue)
  or exists(select * from Table3 where ForeignKeyColumn = searchValue)
  or ...
0 голосов
/ 16 сентября 2009

Как насчет чего-то вроде:

if exists (
 select * from Table1 where MyKey = @key
 union
 select * from Table2 where MyKey = @key
 union
 select * from Table3 where MyKey = @key
 ...
)

У меня нет экземпляра сервера SQL, открытого передо мной, поэтому я уверен, что где-то есть синтаксическая ошибка, но вы поняли идею =)

0 голосов
/ 16 сентября 2009

То есть вы пытаетесь понять, можете ли вы удалить конкретную строку?

Итак ... возможно, попробуйте:

begin tran;
delete tablename
where id = 3;
rollback tran;

Затем посмотрите, какую ошибку вы получите (если есть) и сколько строк затронуто.

0 голосов
/ 16 сентября 2009

Если предположить, что эти 20 таблиц остаются постоянными, тогда как использовать левое внешнее соединение с каждой из таблиц. вероятно, неэффективный способ сделать это, но должен работать

select Id from 
    (Select PK.id, isnull(tbl1.fk,0) as fk1, isnull(tbl2.fk,0) as fk2 ... etc
    from pk left join tbl1 on pk.id = tbl1.fk left join
        tbl2 on pk.id = tbl2.fk ... etc) as VirtualTable
Where fk1>0 or fk2>0 ... etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...