获取两个SELECT语句之间的区别

时间:2011-09-27 09:21:46

标签: mysql sql select

我试图区分两个select语句。

这是第一个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

SELECT 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

我想得到差异 SELECT 1 - SELECT 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 个答案:

答案 0 :(得分:3)

第二个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 :(得分:1)

你试过吗

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

除非存在空值(并且可以补偿这些值),否则应该是差异。

答案 2 :(得分:0)

您没有指定您的平台,但如果您正在运行SQL 2008,则可以使用EXCEPT和INTERSECT来比较两个查询的结果。

答案 3 :(得分:0)

试试吧

   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%'