我試圖確定一個比許多IF/THEN語句更好的方法來確定一個或多個表是否包含一個forign鍵的引用。我只需要知道(真/假)在20個表中的任何一箇中是否存在一行。所有表格都有相同的fk字段。確定一個fk的行是否存在於20個表中的任何一箇中
我希望這是有道理的,如果不是,我會嘗試進一步解釋。
我試圖確定一個比許多IF/THEN語句更好的方法來確定一個或多個表是否包含一個forign鍵的引用。我只需要知道(真/假)在20個表中的任何一箇中是否存在一行。所有表格都有相同的fk字段。確定一個fk的行是否存在於20個表中的任何一箇中
我希望這是有道理的,如果不是,我會嘗試進一步解釋。
我不確定我是否理解這個問題。以下幾點會改善你的情況嗎?
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 ...
這是更簡潔一點 - 謝謝。 – schmoopy 2009-09-16 03:01:19
假設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
所以,你正在努力解決,如果你可以刪除一個特定的行?
所以......也許嘗試:
begin tran;
delete tablename
where id = 3;
rollback tran;
然後看看會發生什麼樣的錯誤(如果有的話),和許多行如何受影響。
什麼是這樣的:
if exists (
select * from Table1 where MyKey = @key
union
select * from Table2 where MyKey = @key
union
select * from Table3 where MyKey = @key
...
)
我沒有在我面前打開一個SQL Server實例,所以我敢肯定,有了這樣一個語法錯誤的地方,但你的想法=)
可能想要工會全部提高速度,因爲您只是在考慮未返回信息 – HLGEM 2009-09-16 13:22:32
SYS.FOREIGN_KEYS和SYS.TABLES ... – 2009-09-16 02:42:23