Запрос, который возвращает все таблицы, которые не содержат определенный столбец - PullRequest
2 голосов
/ 15 июня 2011

Вот простой 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 ]

3 голосов
/ 15 июня 2011

Вам нужны "таблицы, в которых нет идентификатора пользователя / столбца"

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

Edit:

Вы также можете использовать свой запрос original в условии EXCEPT

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

Эти два запроса должны давать идентичные планы и производительность

2 голосов
/ 15 июня 2011
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'
)
1 голос
/ 15 июня 2011

Вы можете заключить его в подзапрос

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...