[英]SQL Server - A query to generate a JOINs path from one table to another?
如果我知道我需要將表4聯接到表1上,但是它們沒有共同的列,那么需要花一些力氣才能找到具有與表1共同的列A的表2,然后找到具有共同的列B的表3。表2和表4,依此類推,最終可以將表4拉入查詢。
有時需要聯接幾個不必要的表才能使兩個需要聯接的聯接。 在某些表設置中,這可能是必不可少的,但是您將如何查詢以便SQL為您創建該路徑,從而省去了弄清楚它的麻煩?
SELECT
CASE
WHEN B.COLUMN_NAME = C.COLUMN_NAME
THEN D.COLUMN_NAME + ' is on both ' + A.TABLE_NAME + ' and ' + D.TABLE_NAME
ELSE 'ZZZNULLZZZ'
END AS 'QuickJoin',
A.TABLE_NAME AS 'Starting Table',
B.COLUMN_NAME AS 'Column 1',
B.TABLE_NAME AS 'Linking Table',
C.COLUMN_NAME AS 'Column 2',
D.TABLE_NAME AS 'Destination Table'
FROM
INFORMATION_SCHEMA.COLUMNS A
JOIN
INFORMATION_SCHEMA.COLUMNS B ON
A.COLUMN_NAME = B.COLUMN_NAME AND
A.TABLE_NAME <> B.TABLE_NAME
JOIN
INFORMATION_SCHEMA.COLUMNS C ON
B.TABLE_NAME = C.TABLE_NAME AND
A.TABLE_NAME <> C.TABLE_NAME
JOIN
INFORMATION_SCHEMA.COLUMNS D ON
C.COLUMN_NAME = D.COLUMN_NAME AND
D.TABLE_NAME NOT IN (A.TABLE_NAME, B.TABLE_NAME, C.TABLE_NAME)
WHERE
-- Starting Table
A.TABLE_NAME = 'Starting Table'
-- Possible Column 1
-- AND B.COLUMN_NAME = 'siteid'
-- Possible Linking Table
-- AND B.TABLE_NAME = 'possibleLinkingTable'
-- Possible Column 2
-- AND C.COLUMN_NAME = 'possibleColumn2'
-- Destination Table
AND D.TABLE_NAME = 'Destination Table'
ORDER BY
QuickJoin, B.COLUMN_NAME, B.TABLE_NAME, C.COLUMN_NAME
沒有自動的解決方案-但是,您可以嘗試做一些事情來幫助您指出正確的方向。
如果您的數據庫設置正確,一種方法可能是查看數據庫中設置了哪些外鍵。
另一個可能有用的工具是檢查其他哪些表具有與源或目標相同的列。
SELECT A.TABLE_NAME, A.COLUMN_NAME, B.TABLE_NAME
FROM
INFORMATION_SCHEMA.COLUMNS A
INNER JOIN
INFORMATION_SCHEMA.COLUMNS B ON
A.COLUMN_NAME = B.COLUMN_NAME AND
A.TABLE_NAME <> B.TABLE_NAME
WHERE A.TABLE_NAME = 'YourStartingTable' OR B.TABLE_NAME = 'YourDestinationTable'
最終,您仍然需要親自查看結果-但是這兩個查詢可能有助於加快花在周圍的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.