Извините за длину здесь, но я надеюсь, что это может помочь следующему человеку, который придет ...
Как предложено выше, я разделю случайный идентификатор на два поля - первое сслучайный идентификатор, а второй с идентификатором фазы.Использование вышеприведенного оператора «работает» возвращает список случайных идентификаторов, которые были запущены (фаза 1 существует), но отсутствуют вторая фаза / фаза завершения.
Однако, поскольку я не хочу тратить время на поиск каждого RIDпо отдельности я завернул оператор EXCEPT в оператор IN, как скопировано ниже.Это позволяет мне контролировать, какие поля действительно возвращаются.
SELECT randomid, phaseid, info, type, time
FROM history
WHERE randomid IN (
SELECT randomid FROM history WHERE phaseid = '1'
EXCEPT
SELECT randomid FROM history WHERE phaseid = '2'
)
Примечание: перенос оператора EXCEPT, как я сделал, приводит к тому, что отдельная часть (см. Ссылку ниже) игнорируется, так как я указываю выбрать все.Кроме того, мне нужно улучшить мой диапазон случайных чисел и / или добавить к нему код даты, чтобы избежать дублирования.Если мне когда-нибудь удавалось получить одно и то же случайное число дважды, и если одно завершено, а другое - неудачно, то, что не удалось (не было фазы 2), не будет отображаться в результатах запроса оператора EXCEPT как существование ЛЮБОЙ совпадающей фазы завершениябудет удовлетворять пункт EXCEPT.Не проверяется, что существует фаза завершения для каждой начальной фазы, только что фаза завершения с совпадающим случайным идентификатором существует вообще.
Если бы у меня была плохо рандомизированная числовая схема, которая приводила к дублированию, я мог бы иметь 16 записей в таблице с одинаковым случайным идентификатором (скажем, случайный идентификатор равен 1337).Четное число записей с RID 1337 выглядело бы хорошо, даже если бы у меня могло быть просто четное количество ошибок (проверка четного числа записей в базе данных действительно не является хорошим способом проверки на ошибки сейчас, когда я думаю,из этого, хотя я мог бы подсчитать количество идентификаторов фазы, которые равны 1, и сравнить его с количеством тех с pid 2 для проверки результатов моего запроса).Скажем, из этих 16 записей 6 были заполнены правильно (фаза 1 и фаза 2), а оставшиеся 4 как-то провалились.Поскольку в базе данных RID 1337 существует запись с идентификатором PID 2, ни один из четырех сбоев не будет отображаться.
Спасибо, что указал мне правильное направление, Барри!
========================================================
Следующая ссылка, похоже, более детально проиллюстрирована на примерах оператора EXCEPT, чем на других сайтах, несмотря на то, что она более старая (например, возвращаются только отдельные результаты по сравнению со всеми результатами).
http://www.databasejournal.com/features/mssql/article.php/3602601/Except-Operator-in-SQL-Server-2005.htm
=======================================================
Общее Пиналя Дейва Суммирование оператора:
ОдинJR.Один день назад разработчик спросил меня, выполняет ли SQL Server аналогичную операцию, как предложение MINUS в Oracle.
Абсолютно, предложение EXCEPT в SQL Server точно аналогично операции MINUS в Oracle.Запрос EXCEPT и запрос MINUS возвращают все строки в первом запросе, которые не были возвращены во втором запросе.Каждый оператор SQL в запросе EXCEPT и запросе MINUS должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.