返回所有不包含特定列的表的查询

时间:2011-06-15 07:42:34

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

这是一个简单的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'列的所有表格。我应该如何查询?

P.S。如果表中包含其他一些不同的列,则使用 NOT LIKE 仍会返回包含“userid”或“user_id”列的表。

非常感谢。

3 个答案:

答案 0 :(得分:3)

您需要“没有列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

这两个查询应该提供相同的计划和性能

答案 1 :(得分: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'
)

答案 2 :(得分:1)

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

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