这是一个简单的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”列的表。
非常感谢。
答案 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