SQL-запрос (динамический?) Для проверки соответствия каждой записи истории - PullRequest
1 голос
/ 17 января 2012

У меня есть хранимая процедура, которая генерирует случайное число с плавающей точкой в ​​качестве идентификатора маркера, и, как только он вызывается, сохраняет случайное число + .1 в таблице истории / регистрации, а затем конечный результат сохраняется сто же случайное число +.2 (в качестве секвенсора / сортировщика).

Существует ли простой способ динамического запроса столбца, заполненного этими порядковыми номерами (как показано ниже), и проверки наличия четного числаих (пар), чтобы легко убедиться, что хранимая процедура всегда обрабатывается правильно?

1568.1
1568.2
8452.1
8452.2
9886.1
9886.2
5455.1
3682.1
3682.2
4857.1
4857.2

В приведенных выше примерах данных я хотел бы запрос, который предупреждает о наличии 5455.1, поскольку он не имеетвторая часть (5455.2), которая всегда должна быть в моей хранимой процедуре, регистрирует вторую запись с результатами вызова (успех или неудача).

Конечно, мне нужно не только предупредить меня о том, чтопроблема / чудак существует (так как я мог бы просто запустить подсчет на столе и посмотреть, является ли число четным, чтобы определить это), я хотел бы быть ablе, чтобы выбрать несоответствия, чтобы я не перебирал 10000 строк истории / журналов, чтобы найти ту, у которой нет партнера.

Ответы [ 2 ]

1 голос
/ 17 января 2012

Во-первых, ваш ID-ключ не должен быть одним столбцом, он должен быть двумя. То есть вместо

CREATE TABLE OneCol  (IDKey DECIMAL(6, 1) Primary Key);

У вас должно быть что-то вроде:

CREATE TABLE TwoCol  
(
    IDRand INT, 
    PhaseID TINYINT
    Primary Key  (IDRand, PhaseID)
)

Предполагая это тогда и дополнительно, что конкретной искомой аномалией, которую вы ищете, является идентификатор с {Phase = 1), но не соответствующий {Phase = 2}, этот единственный способ написать запрос:

SELECT IDRand FROM TwoCol WHERE PhaseID = 1
EXCEPT
SELECT IDRand FROM TwoCol WHERE PhaseID = 2
0 голосов
/ 17 января 2012

Извините за длину здесь, но я надеюсь, что это может помочь следующему человеку, который придет ...

Как предложено выше, я разделю случайный идентификатор на два поля - первое сслучайный идентификатор, а второй с идентификатором фазы.Использование вышеприведенного оператора «работает» возвращает список случайных идентификаторов, которые были запущены (фаза 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 должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.

...