基于表名模式的SQL内连接

时间:2016-07-15 11:36:51

标签: sql sql-server

在这个包含数百个表的旧SQL数据库中,我需要对名称遵循以下格式的所有表进行内部联接:

  • barX_foo_bazX
  • barX_foo_bazY
  • barZ_foo_bazZ
  • 我想用他们名字中的foo加入所有表格

我不确定这是否可行。

显然,使用这种语法并不是(但它可能有助于理解我的目标):

USE [LegacyDB_Name]

SELECT *
FROM '%_foo_%' inner join '%_foo_%'
where my_stuff_is(some condition)

有什么建议吗?关于我如何做到这一点的想法?也许这个年轻的padawan没有看到更容易的路径......

非常感谢!

3 个答案:

答案 0 :(得分:2)

  

我不确定这是否可行。

不,表名不能包含或使用通配符,它​​们必须是字符串。

我的建议是找到制作这些选择查询的程序,并在那里的查询中包含您需要的任何模式匹配。

但是您完成的查询必须包含表名作为字符串。

答案 1 :(得分:1)

也许最简单的方法是根据以下查询声明游标并构建动态sql查询。研究tsql游标和动态sql执行它应该相当简单。

SELECT * 
    FROM information_schema.tables
    Where Table_Type = 'Base Table' And Table_Name Like '%_foo_%'

答案 2 :(得分:1)

如果你的表都具有相同的结构(即列),那么你可以分两步完成。

  1. 生成SQL语句:

    select 'UNION ALL SELECT ''' + table_name + ''' AS table_name, * FROM ' 
           + table_name AS stmt
    from   information_schema.tables
    where  table_type = 'BASE TABLE' 
       and table_catalog = 'LegacyDB_Name'
       and table_name LIKE '%foo%';
    

    输出类似于:

    stmt
    --------------------------------------------------------------------
    UNION ALL SELECT 'barX_foo_bazX' AS table_name, * FROM barX_foo_bazX
    UNION ALL SELECT 'barX_foo_bazY' AS table_name, * FROM barX_foo_bazY
    UNION ALL SELECT 'barX_foo_bazZ' AS table_name, * FROM barX_foo_bazZ
    

    从此输出中,复制SQL行并从第一行中删除前两个单词(UNION ALL)。这是一个有效的SQL语句。

  2. 执行上面派生的SQL语句

    如果您更频繁地需要此SQL,请为其创建一个视图:

    CREATE OR REPLACE VIEW all_foo AS
                  SELECT 'barX_foo_bazX' AS table_name, * FROM barX_foo_bazX
        UNION ALL SELECT 'barX_foo_bazY' AS table_name, * FROM barX_foo_bazY
        UNION ALL SELECT 'barX_foo_bazZ' AS table_name, * FROM barX_foo_bazZ;
    

    现在您可以查询

    SELECT * FROM all_foo WHERE ...