SQL Server-生成从一个表到另一个表的连接路径的查询?

SQL Server-生成从一个表到另一个表的连接路径的查询?,sql,sql-server,join,multiple-tables,jointable,Sql,Sql Server,Join,Multiple Tables,Jointable,如果我知道我需要将表4连接到表1上,但它们没有共同的列,那么需要花费一些努力来找到一个表2,其中a列与表1相同,然后是一个表3,其中B列与表2和表4相同,依此类推,最终能够将表4拉入查询 有时需要连接一些不必要的表来连接两个需要连接的表。对于某些表设置来说,这可能是一个必要的缺点,但是如何进行查询,以便SQL为您创建该路径,从而省去计算它的麻烦呢 编辑: 这个怎么样?谢谢你让我走上这条轨道 SELECT CASE WHEN B.COLUMN_NAME = C.

如果我知道我需要将表4连接到表1上,但它们没有共同的列,那么需要花费一些努力来找到一个表2,其中a列与表1相同,然后是一个表3,其中B列与表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'

最终,您仍然需要自己查看结果,但这两个查询可能有助于加快环顾四周的时间。

您可以创建一个视图吗?确实没有办法让sql server自动确定如何跨多个表构建联接。需要联接一些不必要的表,如果您需要它们联接其他表,它们显然是必需的。如果有方法自动执行此操作,我将失业。谢谢,我对此进行了调整,并提出了一个查询,这可能有助于手动查找两个表之间没有键的链接表。我把这个问题添加到我原来的帖子中。你怎么认为?