【问题标题】:Query that returns all tables that don't contain a particular column返回所有不包含特定列的表的查询
【发布时间】:2011-06-15 07:42:33
【问题描述】:

这是一个简单的 sql 查询,它将返回具有以下列名称“userid”或“user_id”的所有表。

SELECT  t.name 
FROM sys.tables t
INNER JOIN sys.columns c ON t.object_id = c.object_id
WHERE c.name LIKE 'userid' OR c.name LIKE 'user_id'
ORDER BY name

但是,我想在这里做的是获取所有不包含“userid”列和“user_id”列的表。我应该如何查询这个?

附:如果表有其他一些不同的列,使用 NOT LIKE 仍会恢复包含“userid”或“user_id”列的表。

非常感谢。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008


    【解决方案1】:

    您需要“不存在列 userid/user_id 的表”

    SELECT
        t.name 
    FROM 
        sys.tables t
    WHERE
        NOT EXISTS (SELECT *
              FROM sys.columns c
              WHERE t.object_id = c.object_id AND c.name IN ('userid', 'user_id'))
    ORDER BY
        t.name
    

    编辑:

    您还可以在 EXCEPT 子句中使用 original 查询

    SELECT t.name FROM sys.tables t
    EXCEPT
    SELECT t.name 
    FROM sys.tables t
    INNER JOIN sys.columns c ON t.object_id = c.object_id
    WHERE c.name IN  ('userid', 'user_id')
    ORDER BY t.name
    

    这两个查询应该给出相同的计划和性能

    【讨论】:

    • 非常感谢。他们俩都工作得很好。很好地使用 EXCEPT,尤其是。
    【解决方案2】:
    SELECT name from sys.tables 
    WHERE name not in (
        SELECT  t.name 
        FROM sys.tables t
        INNER JOIN sys.columns c ON t.object_id = c.object_id
        WHERE c.name LIKE 'userid' OR c.name LIKE 'user_id'
    )
    

    【讨论】:

      【解决方案3】:

      您可以将其包装在子查询中

      Select t2.Name
      From sys.tables t2
      Where t2.Name Not In 
      (
          SELECT  t.name 
          FROM sys.tables t
          JOIN sys.columns c ON t.object_id = c.object_id
          WHERE c.name LIKE 'userid' OR c.name LIKE 'user_id'
      )
      ORDER BY t2.name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-17
        • 2022-07-23
        • 2019-08-22
        • 1970-01-01
        • 2014-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多