SQL-запрос для возврата значения на основе условий не работает - PullRequest
1 голос
/ 04 мая 2019

Мой запрос не должен возвращать 1, когда оба значения (srf1.shipment_refnum_qual_gid = 'DUCAB.EXCISE_INVOICE_ATTACHED' и srf2.shipment_refnum_qual_gid = 'DUCAB.BOL_ATTACHED') равны одному из Y, но одно из которых может равняться одному. как Y.

В настоящее время мой запрос работает, когда оба значения N или одно из значений N, но всякий раз, когда мои значения refnum равны Y, мой запрос не работает.

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

Я пытался использовать IN, но он не работает.

select 1 
from shipment sh, shipment_refnum srf1, shipment_refnum srf2, shipment_remark srk
where 
    sh.shipment_gid = srf1.shipment_gid
    and sh.shipment_gid = srf2.shipment_gid 
    and srf1.shipment_gid = srk.shipment_gid 
    and srf2.shipment_gid = srk.shipment_gid
    and srf1.shipment_refnum_qual_gid = 'DUCAB.EXCISE_INVOICE_ATTACHED'
    and srf2.shipment_refnum_qual_gid = 'DUCAB.BOL_ATTACHED'
    and srf1.shipment_refnum_value in ('Y','N')
    and srf2.shipment_refnum_value in ('Y','N')
    and srk.remark_qual_gid = 'DUCAB.REASON_FOR_REJECTION'
    and srk.remark_text not in ('NO_VALUE')
    and sh.shipment_gid = 'DUCAB.20110'

Итак, мой желаемый результат, если shipment_refnum_value из 'DUCAB.EXCISE_INVOICE_ATTACHED' равно Y, а shipment_refnum_value из 'DUCAB.BOL_ATTACHED' равно Y, тогда мой запрос не должен возвращать 1.

1 Ответ

1 голос
/ 04 мая 2019

Во-первых, ваш запрос просто возвращает 1, никакого другого контекста.Обычно запрос на выборку возвращает несколько записей, показывающих разные столбцы из разных таблиц.Итак, я изменяю ваш запрос, чтобы показывать отгрузки и номера, которые, по-видимому, соответствуют тому, что вы описываете, что вы ищете ... Только srf1 ИЛИ srf2 может = "Y", а не оба = "Y".

Во-вторых, я настраиваю ваш запрос на использование синтаксиса JOIN вместо объявления WHERE.

В-третьих, через транзитивную ассоциацию, если A = B и B = C, то A = C.

sh.Shipment_gid = srf1.Shipment_gid and srf1.shipment_gid = srk.shipment_gid 

затем

sh.Shipment_gid = srk.shipment_gid 




select 
      sh.shipment_gid,
      1 
   from 
      shipment sh
         JOIN shipment_refnum srf1
            ON sh.shipment_gid = srf1.shipment_gid
           and srf1.shipment_refnum_qual_gid = 'DUCAB.EXCISE_INVOICE_ATTACHED'
           and srf1.shipment_refnum_value in ('Y','N')
         JOIN shipment_refnum srf2
            ON sh.shipment_gid = srf2.shipment_gid
           and srf2.shipment_refnum_qual_gid = 'DUCAB.BOL_ATTACHED'
           and srf2.shipment_refnum_value in ('Y','N')
         JOIN shipment_remark srk
            ON sh.shipment_gid = srk.shipment_gid 
           and srk.remark_qual_gid = 'DUCAB.REASON_FOR_REJECTION'
           and srk.remark_text not in ('NO_VALUE')
   where 
          sh.shipment_gid = 'DUCAB.20110'
      -- THIS Clause makes sure only ONE of them is a Y 
      -- hence not equal to each other.
      AND srf1.shipment_refnum_value <> srf2.shipment_refnum_value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...