Нужно ли ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ для этой ситуации? - PullRequest
1 голос
/ 01 марта 2011

Я пытаюсь найти альтернативу использованию FULL OUTER JOIN для хранимой процедуры, которую я пишу.Вот сценарий.

Две таблицы в основном несвязанных данных, представляющих события, которые должны произойти.События должны быть обработаны в хронологическом порядке, и обе таблицы имеют столбец datetime.Поэтому мне нужно получить одну таблицу, которая действует как список ВСЕХ этих событий, упорядоченных по datetime (эти два столбца datetime необходимо смешать вместе).

Небольшой улов: иногда события из этих двух таблиц будутсвязанные, и в этом случае событие из таблицы A должно идти первым независимо от даты и времени.Поэтому, если у A есть 3 события, а у B - 3, но между A и B есть одна связанная пара, я хочу вернуть 5 строк.В тех случаях, когда есть несвязанные данные, будут NULL-данные (и это нормально, я использую NULL-проверки данных, чтобы определить, что делать дальше, то есть обрабатывать событие A или B и т. Д.)выглядит примерно так:

    SELECT
    CASE
        WHEN A.EventDateTime IS NULL THEN B.EventDateTime
        ELSE A.EventDateTime 
    END AS SortDateTime,
    A.EventId,
    B.EventId,
    FROM A FULL OUTER JOIN B
    ON A.RelatedData=B.RelatedData
    ORDER BY SortDateTime

Ответы [ 3 ]

5 голосов
/ 01 марта 2011

Это должно быть хорошо

также вместо использования CASE

 CASE
        WHEN A.EventDateTime IS NULL THEN B.EventDateTime
        ELSE A.EventDateTime 
    END AS SortDateTime,

Вы можете сделать это

COALESCE(A.EventDateTime,B.EventDateTime) AS SortDateTime,

Что немного короче

1 голос
/ 01 марта 2011

Если вы действительно хотите избежать ВНЕШНЕГО СОЕДИНЕНИЯ, вы можете попробовать

SELECT A.EventDateTime, A.EventID
FROM A
UNION ALL
SELECT B.EventDateTime, B.EventID
FROM B WHERE B.RelatedData NOT IN (SELECT RelatedData FROM A)

Вышеупомянутый NOT IN in может быть записан как NOT EXISTS SELECT 1 FROM A WHERE A.RelatedData = B.RelatedData или как LEFT JOIN ... IS NULL, если ваша СУБД имеет предпочтения (или есликоррелированный подзапрос лучше для вашего набора данных).

0 голосов
/ 01 марта 2011

Если нет точной связи между этими двумя понятиями, я не могу придумать какой-либо другой способ, которым вы могли бы выполнить это.

...