2015-06-18 4 views
0

Я использую SQL Server 2012.проверка, если идентификатор существует в нескольких таблицах

У меня есть 5 таблиц (назовем их A, B, C, D & E). Каждая таблица содержит столбец с именем m_id, который содержит id, которые являются nvarchar (10).

В настоящее время я запускаю запрос ниже 5 раз (изменение имени таблицы). Чтобы увидеть, содержит ли таблица идентификатор.

select m_id from A where m_id = 'some_id' 

В основном я хочу знать, если идентификатор любой из 5 таблиц, если это вернуть 1 еще, если не существует ни в одном из 5 таблиц возвращают 0.

Я чувствую текущий способ ввода «Это очень неэффективно. Есть лучший способ сделать это?

+0

Проверить этот ответ - кажется, почти похоже на то, что вы пытаетесь сделать - HTTP : //stackoverflow.com/a/3281916 – jay

+0

Вы можете сделать один запрос UNION ALL из всех 5 таблиц. –

+0

Как еще вы можете посмотреть в 5 разных таблицах для заданного значения без запуска 5 запросов? –

ответ

3

Вы можете использовать UNION (удаляет дубликаты заранее) или UNION ALL:

SELECT CASE WHEN EXISTS 
    (SELECT 1 FROM (SELECT m_id FROM A 
        UNION 
        SELECT m_id FROM B 
        UNION 
        SELECT m_id FROM C 
        UNION 
        SELECT m_id FROM D 
        UNION 
        SELECT m_id FROM E) All 
    WHERE All.m_id = 'some_id') 
THEN 1 ELSE 0 END AS ContainsID 
+0

Действительно ли это работает быстрее или эффективнее? Если бы вы могли объяснить, почему? – Curmudgeon

+0

@Curmudgeon: быстрее чем? Это по крайней мере один запрос. При правильных индексах на 'm_id' он должен быть эффективным. Но я не понимаю, почему OP требует 5 таблиц вообще. Обычно одной таблицы должно быть достаточно с другим столбцом 'TypeID'. –

+0

@TimSchmelter: Я имею в виду быстрее, чем 5 отдельных запросов, которые он использует сейчас. Мне просто интересно, в чем преимущество одного более длинного запроса на более короткие, более быстрые? Индексы на 'm_id' повысят производительность в обоих случаях. – Curmudgeon

0

Вы можете использовать это:

SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END as returnCode 
FROM (
    SELECT m_id, N'A' as tableName FROM A WHERE m_id = 'some_id' 
    UNION ALL 
    SELECT m_id, N'B' as tableName FROM B WHERE m_id = 'some_id' 
    UNION ALL 
    SELECT m_id, N'C' as tableName FROM C WHERE m_id = 'some_id' 
    UNION ALL 
    SELECT m_id, N'D' as tableName FROM D WHERE m_id = 'some_id' 
    UNION ALL 
    SELECT m_id, N'E' as tableName FROM E WHERE m_id = 'some_id' 
) data