SQL查询在两个不同的查询中返回不同的结果

时间:2019-10-09 20:53:13

标签: sql sql-server tsql stored-procedures

我正在尝试更新旧的SQL查询,该查询返回1020行数据;但是,新查询返回1864行。我已经尝试了左联接/内联接。谢谢。

旧查询(1020行)

select 
    cl.clid as clid_, cl.id as hlid_, holdinNo, 
    holding,ClientID as clientid_, ClientName as clientName_  
from 
    tx_holding as cl 
where 
    cl.status = 1 
    and cl.roadno = '001'
    and cl.id in (select hlid from tx_asset where asset is not null) 
    and cl.clid in (select id from tbl_client where client_type = 'Non-Govt.') 
    and cl.id not in (select hlid from tx_bill_pay 
                      where year(date_month) = 2019 and hlid is not null 
                      group by hlid)

新查询(1864行)

select * 
from  
    (select 
         cl.clid, cl.id, cl.holdinNo,  cl.holding,
         cl.ClientID as clientid_, cl.ClientName as clientName_  
     from 
         tx_holding as cl 
     where 
         cl.status = 1 
         and cl.roadno = '001') AS cl
inner join
    (select clid, hlid 
     from tx_asset 
     where asset is not null) as A on Cl.id = A.hlid 
inner join 
    (select cellNo, id 
     from tbl_client 
     where client_type = 'Non-Govt.') as C on cl.clid = C.id
where
    cl.id not in (select hlid
                  from tx_bill_pay
                  where year(date_month) = 2019  
                    and hlid is not null 
                  group by hlid) 

2 个答案:

答案 0 :(得分:1)

可能在您的左联接中。

如果联接返回具有相同联接条件的多个记录,则从具有实例(在子句中)到联接可以做到这一点。我将从删除未使用的条件开始,然后为选择添加一个区别。如果这样可以解决问题,则可以一次删除一个distncts,以查看重复位置。然后,我将选择范围从不重复更改为分组依据。我还要重做where子句,不在ID集合中的那是一种糟糕的过滤方式。

LEFT JOIN
    (
        SELECT DISTINCT hlid
        FROM tx_asset
        WHERE asset IS NOT NULL
    ) AS A
    ON Cl.id = A.hlid

LEFT JOIN
    (
        SELECT DISTINCT id
        FROM tbl_client WHERE client_type = 'Non-Govt.'
    ) AS C
    ON cl.clid=C.id
WHERE cl.id NOT IN
(
    SELECT hlid
    FROM tx_bill_pay
    WHERE
        year(date_month) = 2019 AND
        hlid IS NOT NULL
    GROUP BY hlid
)

答案 1 :(得分:1)

如果我没记错的话,则需要新的查询迭代以返回与旧查询完全相同的结果(两者都必须为1020)。

但是,新查询的结构正在考虑以前未视为联接(内部或左侧)的表,因此由于主键绑定不足,您可能会出现数据重复的情况。

1)在原始查询中,您只扫过“ tx_holding”并且没有创建新的联接。您的约束语句正在寻找不同表中的数据,但没有直接连接到基表中,并且由于它们返回单个字段,因此IN语句可以正常工作。

2)在新查询中,您仅将“ tx_asset”中的一个字段绑定到基本表,因此该表很可能具有复合主键(2个或更多字段作为键字段),因此您将获得像这样的东西:

TX_HOLDING(CL)
ID
1
2
3
4

TX_ASSET(A)
HLID CLID
1 1
1 2
2 1
2 2
3 1

由于您只将表联接在单个字段上(CL.ID = A.HLID),因此会产生重复性,因为您有2条记录等于1,但是具有不同的辅助主键。

一个可能的解决方案是,如果这两个字段与您的表结构完全匹配,则添加另一个绑定CL.CLID = A.CLID的ON语句。还应考虑您正在子查询中调用它,但实际上并未使用它。这将扩展到您第二次使用“ tbl_client”加入。