Как оценить несколько записей по одной записи, чтобы найти отсутствие совпадающих значений? - PullRequest
0 голосов
/ 08 октября 2019

Я создаю несколько запросов QA / QC для очистки моих данных и пытаюсь найти отсутствие совпадающих значений между двумя таблицами. Всего у меня есть три таблицы: проверки (INSP), оценки рисков (RA) и рабочие задания (WO). Проверки генерируют оценки риска (INSP.GlobalID = RA.InspectionGlobalID) и имеют значение от 1 до многих. Оценки риска генерируют рабочие задания и имеют значение от 1 до 1 (RA.WorkOrderGlobalID = WO.GlobalID). Проверки и рабочие задания - от 1 до 1 (INSP.GlobalID = WO.InspectionGlobalID). Они оба имеют поле «Приоритет», которое представляет собой smallint, которое находится в диапазоне от 0 до 12 и указывает, насколько важен рабочий порядок и когда он выполняется (12 является наиболее критичным). У меня проблема в том, что может быть несколько записей RA, связанных с одним рабочим заданием. Я пытаюсь найти случаи, когда между Приоритетом оценки риска и Приоритетом рабочего задания отсутствуют совпадающие значения. Например, может быть 3 RA с приоритетами 6, 8, 10. Рабочее задание может иметь 8 приоритетов (что является приемлемым), и в этом случае я бы не хотел выбирать какой-либо из этих RA, поскольку существует соответствующий приоритетв группе, но мой запрос выбирает 6 и 10 приоритетных RA из группы. Как мне оценить все RA, связанные с INSP, и выбрать записи, в которых вообще нет совпадающего приоритета между двумя таблицами (RA / WO).

SELECT
RA.Priority,
WO.Priority , 
RA.InspectionGlobalID as RA_INSP_GLBID,
WO.InspectionGlobalID,
RA.WorkOrderGlobalID as RAWOGLBID,
WO.GlobalID,
WO.OBJECTID as WOID, 
INSP.GlobalID,
INSP.OBJECTID as INID,
RA.OBJECTID RA_OBJECTID

FROM 
CFAdmin.RISKASSESSMENT_EVW as RA INNER JOIN
CFAdmin.WORKORDER_EVW AS WO ON WO.GlobalID = RA.WorkOrderGlobalID LEFT OUTER JOIN
CFAdmin.INSPECTION_EVW as INSP ON INSP.GlobalID = RA.InspectionGlobalID LEFT OUTER JOIN
CFAdmin.PLANTINGSPACE_EVW as PS ON INSP.PlantingSpaceGlobalID = PS.GlobalID 

WHERE
RA.Priority <> WO.Priority AND          
INSP.InspectionDate IS NOT NULL AND             
(INSP.CreatedDate > '7/1/2018') AND             
WO.CancelDate IS NULL AND
WO.Status <>2 AND                               
(WO.CreatedDate > '7/1/2018') AND                            
WO.Type NOT IN (17,18, 44,45,3) AND            
WO.WOEntity = 0

1 Ответ

0 голосов
/ 09 октября 2019

Сведение SQL к той части, которая относится к этому вопросу: (Вы даже не используете ничего из PLANTINGSPACE_EVW)

SELECT RA.Priority
, WO.Priority
, RA.WorkOrderGlobalID as RAWOGLBID
, WO.GlobalID

FROM CFAdmin.RISKASSESSMENT_EVW as RA
  INNER JOIN CFAdmin.WORKORDER_EVW AS WO ON WO.GlobalID = RA.WorkOrderGlobalID
                                        AND WO.Priority <> RA.Priority

WHERE WO.CancelDate IS NULL
  AND WO.Status <> 2
  AND WO.CreatedDate > cast('7/1/2018' as date)
  AND WO.Type NOT IN (17, 18, 44, 45, 3)
  AND WO.WOEntity = 0

Вы должны получить все записи, где приоритеты неmatch.

Я не могу проверить без выборочных данных, но как насчет этого?

SELECT RA.Priority
, WO.Priority
, RA.InspectionGlobalID as RA_INSP_GLBID
, WO.InspectionGlobalID
, RA.WorkOrderGlobalID as RAWOGLBID
, WO.GlobalID
, WO.OBJECTID as WOID
, RA.OBJECTID RA_OBJECTID

FROM CFAdmin.RISKASSESSMENT_EVW as RA
  INNER JOIN CFAdmin.WORKORDER_EVW AS WO ON WO.GlobalID = RA.WorkOrderGlobalID

WHERE WO.GlobalId not in (
    SELECT distinct WO2.GlobalID

    FROM CFAdmin.RISKASSESSMENT_EVW as RA2
      INNER JOIN CFAdmin.WORKORDER_EVW AS WO2 ON WO2.GlobalID = RA2.WorkOrderGlobalID
                                             AND WO2.Priority = RA2.Priority
  )
  AND WO.CancelDate IS NULL
  AND WO.Status <> 2
  AND (WO.CreatedDate > '7/1/2018')
  AND WO.Type NOT IN (17, 18, 44, 45, 3)
  AND WO.WOEntity = 0
...