Получите разницу между двумя инструкциями SELECT - PullRequest
2 голосов
/ 27 сентября 2011

Я пытаюсь получить разницу между 2 select утверждениями.

Вот первый select:

ВЫБРАТЬ 1

SELECT *
FROM h_log_material
LEFT JOIN h_log_stkpnl
ON  h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
where 
h_log_material.WO_ID='E11TMB7M05'
and h_log_material.mtrl_type='BL'

Выход 4917

ВЫБРАТЬ 2

Вот второй select:

SELECT *
FROM h_log_material
LEFT JOIN h_log_stkpnl
ON  h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
where 
h_log_material.WO_ID='E11TMB7M05'
and h_log_material.mtrl_type='BL'
and h_log_stkpnl.op_id like '%STOCK-IN%'

Выход 4870

Я хотел бы получить разницу ВЫБРАТЬ 1 - ВЫБРАТЬ 2

В качестве вывода мне нужны строки, которых нет в select 2.

Я пробовал это, но он возвращает 0.

SELECT *
FROM h_log_material
LEFT JOIN h_log_stkpnl
ON  h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
where 
h_log_material.WO_ID='E11TMB7M05'
and h_log_material.mtrl_type='BL'
and not exists
(SELECT *
FROM h_log_material
LEFT JOIN h_log_stkpnl
ON  h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
where 
h_log_material.WO_ID='E11TMB7M05'
and h_log_material.mtrl_type='BL'
and h_log_stkpnl.op_id like '%STOCK-IN%')

Ответы [ 4 ]

3 голосов
/ 27 сентября 2011

2-й SELECT выглядит как подмножество первого, так что вы можете сделать

SELECT COUNT(*) - COUNT(CASE
                          WHEN h_log_stkpnl.op_id LIKE '%STOCK-IN%' THEN 1
                        END)
FROM   h_log_material
       LEFT JOIN h_log_stkpnl
         ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID
WHERE  h_log_material.WO_ID = 'E11TMB7M05'
       AND h_log_material.mtrl_type = 'BL'  

Редактировать

После вашего разъяснения, что вам нужны столбцы, а не COUNT попробуйте этот

SELECT *
FROM   h_log_material
       LEFT JOIN h_log_stkpnl
         ON h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID
            AND h_log_stkpnl.op_id LIKE '%STOCK-IN%'
WHERE  h_log_material.WO_ID = 'E11TMB7M05'
       AND h_log_material.mtrl_type = 'BL'
       AND h_log_material.MODULE_UNIQUE_ID IS NULL  

Ваш первый запрос выполняет LEFT JOIN, но предложение WHERE на втором эффективно преобразует его во внутреннее соединение.Таким образом, разница между запросами должна заключаться в тех строках, в которых либо нет совпадения в h_log_stkpnl, либо совпадение не LIKE '%STOCK-IN%' (я думаю!)

1 голос
/ 27 сентября 2011

Вы пробовали

and h_log_stkpnl.op_id not like '%STOCK-IN%'

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

0 голосов
/ 27 сентября 2011

попробуйте

   SELECT h_log_material.field1,h_log_material.field2
    FROM h_log_material
    LEFT JOIN h_log_stkpnl
    ON  h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
    where 
    h_log_material.WO_ID='E11TMB7M05'
    and h_log_material.mtrl_type='BL'

    minus 

    SELECT h_log_material.field1,h_log_material.field2
    FROM h_log_material
    LEFT JOIN h_log_stkpnl
    ON  h_log_stkpnl.MODULE_UNIQUE_ID = h_log_material.MODULE_UNIQUE_ID 
    where 
    h_log_material.WO_ID='E11TMB7M05'
    and h_log_material.mtrl_type='BL'
    and h_log_stkpnl.op_id like '%STOCK-IN%'
0 голосов
/ 27 сентября 2011

Вы не указываете свою платформу, но если вы используете SQL 2008, вы можете использовать EXCEPT и INTERSECT для сравнения результатов двух запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...