SQL-сервер выбрать из одной из двух возможных таблиц - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть две таблицы: текущая таблица и таблица архива.

При поиске записи я не знаю, в какой таблице она будет находиться, поэтому у меня есть запрос, похожий на следующий:

SELECT myThing FROM (current UNION archive)

Я хотел бы знать, возможно ли написать вышеупомянутый запрос как-то вроде

SELECT myThing FROM current

IF myThing IS NULL
BEGIN
    SELECT myThing FROM ARCHIVE
END

и который, если либо, либо эти подходы, вероятно, будут более производительными.

Ответы [ 4 ]

2 голосов
/ 02 декабря 2010

Ваш второй пример будет практически работать как есть.Просто нужна переменная

Declare @theThing varchar(max)

SELECT @theThing = myThing FROM current

IF (@theThing IS NULL)
BEGIN
    SELECT @theThing = myThing FROM ARCHIVE
END

-- to 'output' the value
SELECT @theThing

Затем вы можете вставить этот код в хранимую процедуру или функцию или что-то в этом роде.

Обратите внимание, будет ли он быстрее объединения или нет.Моя догадка была бы выше, будет быстрее, если myThing проиндексирован в обеих таблицах.Но это только предположение.

edit: На производительность также будет влиять то, как часто эта вещь встречается в первой таблице.Приведенный выше код, скорее всего, будет быстрее, чем union, если в большинстве случаев цель находится в первой таблице.

edit: Как указывает Мартин, все это того стоит, только если в двух таблицах гарантированно будет только одно совпадение.В противном случае вам нужен союз.

1 голос
/ 02 декабря 2010

Использование UNION приведет к снижению производительности, поскольку это приведет к различному виду двух таблиц. План с UNION ALL выглядит хорошо для меня. Вы можете добавить TOP 1, чтобы он перестал искать после того, как найден первый ряд.

CREATE TABLE #current (id INT PRIMARY KEY, DATA CHAR(10))   
CREATE TABLE #ARCHIVE (id INT PRIMARY KEY, DATA CHAR(10))   

INSERT INTO #current
SELECT 1, 'A' UNION ALL SELECT 2, 'B' 

INSERT INTO #ARCHIVE
SELECT 101, 'C' UNION ALL SELECT 102, 'D' 

DECLARE @id INT
SET @id = 102

;WITH things AS
(
SELECT * FROM #current
UNION ALL
SELECT * FROM #ARCHIVE
)

SELECT TOP (1) id,DATA 
FROM things
WHERE id = @id
0 голосов
/ 18 апреля 2012

Я могу предложить этот вариант

select coalesce((select someData from One where Id = 12345), (select someData from Two where Id = 12345))
0 голосов
/ 02 декабря 2010

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

CREATE VIEW all_records
AS
SELECT * from current
UNION ALL
SELECT * from archive

и выберите запись из вида:

select * from all_records
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...