我正在尝试更新旧的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)
答案 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”加入。