Проверка запросов в SQL Server Management Studio на предмет повреждения данных (выборки, объединения и т. Д.) - PullRequest
1 голос
/ 22 мая 2019

Я пытался написать запрос для двух таблиц ( Квитанция и Квитанция ), чтобы найти повреждение данных, если квитанция не содержит строк.У меня есть .bak файла базы данных на диске Google, но я не уверен, что кто-то здесь захочет помочь мне так далеко: D

т.е. Написать запроснайти повреждение данных, если квитанция не содержит строк.(СОВЕТ: используйте таблицы Receipt и ReceiptLine).- Вернуть столбцы UniqReceipt и ReferNumber.

Мне нужно вернуть столбцы 'UniqReceipt' и 'ReferNumber'.

Это похоже на первичный ключ Receipt таблица - это столбец «UniqReceipt», а первичный ключ ReceiptLine - столбец «UniqReceiptLine», а внешний ключ «UniqReceipt» - ССЫЛКИ на столбец «UniqReceipt» в таблице Receipt

Таблица Receipt выглядит следующим образом: enter image description here

, а таблица ReceiptLine выглядит следующим образом: enter image description here

Iв конечном итоге придумал это:

SELECT r.UniqReceipt, r.ReferNumber
FROM Receipt r
INNER JOIN ReceiptLine l ON r.UniqReceipt = l.UniqReceipt
WHERE datalength(l.ReceiptLineNumber) = 0 OR ReceiptLineNumber = '-1' OR ReceiptLineNumber IS NULL

Кто-нибудь знает, если это лучший способ реализовать это?Я в основном посмотрел, когда ReceiptLineNumber был пуст или NULL или '-1' (мы используем -1 вместо NULL) и присоединился, когда UniqReceipt = UniqReceipt в обеих таблицах.

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

Результат запроса: enter image description here

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Ваш запрос в порядке, за исключением части INNER JOIN. Это только покажет, где запись присутствует в обеих таблицах. Вам нужно использовать левое внешнее соединение вместо этого. Это покажет все записи из таблицы слева и соответствующие записи из таблицы справа. Если вы также добавите предложение WHERE для пропущенных строк, вы получите недействительные квитанции:

SELECT r.UniqReceipt, r.ReferNumber
FROM Receipt r
LEFT OUTER JOIN ReceiptLine l ON r.UniqReceipt = l.UniqReceipt
WHERE l.ReceiptLineNumber IS NULL
0 голосов
/ 22 мая 2019

Вы можете написать запрос ниже, чтобы классифицировать случаи, когда ReceiptLine отсутствует, а затем выбрать только эти поступления.

Еще одна вещь, вы всегда должны представлять значения NULL одним способом. В одном месте вы представляете их как -1, а в другом месте вы оставляете их как NULL, а в другом месте вы оставляете их как пустое пространство. Это приведет к путанице. Я бы предложил просто оставить их как NULL, для большей ясности, если для квитанции нет строк поступления.

SELECT UniqReceipt,ReferNumber
FROM  
(SELECT r.UniqReceipt
      , r.ReferNumber
      , CASE WHEN l.ReceiptLineNumber = '-1' THEN 0
             WHEN LEN(l.ReceiptLineNumber) = 0 THEN 0
             WHEN l.ReceiptLineNumber IS NULL THEN 0
             ELSE 1 END AS IsReceiptLineNumberPresent                                       
FROM Receipt r
LEFT OUTER JOIN ReceiptLine l ON r.UniqReceipt = l.UniqReceipt) AS t
WHERE IsReceiptLineNumberPresent = 0                                
...