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

SQL查询在两个不同的查询中返回不同的结果,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我正在尝试更新旧的SQL查询,它返回1020行数据;但是,新查询返回1864行。我尝试了两种左连接/内连接。谢谢 旧查询(1020行) 新查询(1864行) 它可能在你的左关节 如果联接返回相同联接条件的多个记录,则从拥有实例(in子句)到联接可以做到这一点。首先,我要删除未使用的条件,并向选择添加一个distinct。如果这解决了问题,我会一次删除一个distncts,看看复制的位置。然后,我将select从distinct更改为group by。我还需要重做where子句,一组ID中的not

我正在尝试更新旧的SQL查询,它返回1020行数据;但是,新查询返回1864行。我尝试了两种左连接/内连接。谢谢

旧查询(1020行)

新查询(1864行)


它可能在你的左关节

如果联接返回相同联接条件的多个记录,则从拥有实例(in子句)到联接可以做到这一点。首先,我要删除未使用的条件,并向选择添加一个distinct。如果这解决了问题,我会一次删除一个distncts,看看复制的位置。然后,我将select从distinct更改为group by。我还需要重做where子句,一组ID中的not是一种可怕的过滤方式

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
)

它可能在你的左关节

如果联接返回相同联接条件的多个记录,则从拥有实例(in子句)到联接可以做到这一点。首先,我要删除未使用的条件,并向选择添加一个distinct。如果这解决了问题,我会一次删除一个distncts,看看复制的位置。然后,我将select从distinct更改为group by。我还需要重做where子句,一组ID中的not是一种可怕的过滤方式

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
)

如果我没有弄错的话,您需要查询的新迭代来返回与旧查询完全相同的结果(两者都需要是1020)

但是,新查询的结构考虑了以前未被视为联接(内部或左侧)的表,因此可能会由于主键绑定不足而导致数据重复

1) 在最初的查询中,您只浏览了“tx_holding”,没有创建新联接。您的约束语句正在搜索不同表中的数据,但没有直接连接到基表,因为它们返回单个字段,in语句工作正常

2) 在新查询中,您仅将“tx_资产”中的一个字段绑定到基表,因此该表很可能有一个复合主键(2个或更多字段作为键字段),因此您将得到如下结果:

德克萨斯州控股公司(CL)
ID
1
2
3
四,

TX_资产(A)
HLID CLID
11
1.2
2.1
2
3.1

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


一个可能的解决方案是添加另一个ON语句,该语句绑定CL.CLID=A.CLID,当然,如果这两个字段与您的表结构匹配;还可以考虑在子查询中调用它,但实际上不使用它。这将扩展到您与“tbl_客户端”的第二次连接。

如果我没有弄错的话,您需要查询的新迭代以返回与旧查询完全相同的结果(两者都需要是1020)

但是,新查询的结构考虑了以前未被视为联接(内部或左侧)的表,因此可能会由于主键绑定不足而导致数据重复

1) 在最初的查询中,您只浏览了“tx_holding”,没有创建新联接。您的约束语句正在搜索不同表中的数据,但没有直接连接到基表,因为它们返回单个字段,in语句工作正常

2) 在新查询中,您仅将“tx_资产”中的一个字段绑定到基表,因此该表很可能有一个复合主键(2个或更多字段作为键字段),因此您将得到如下结果:

德克萨斯州控股公司(CL)
ID
1
2
3
四,

TX_资产(A)
HLID CLID
11
1.2
2.1
2
3.1

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


一个可能的解决方案是添加另一个ON语句,该语句绑定CL.CLID=A.CLID,当然,如果这两个字段与您的表结构匹配;还可以考虑在子查询中调用它,但实际上不使用它。这将扩展到您与“tbl_客户端”的第二次连接。

您的问题是什么?那么您在这里的问题是什么,仅仅是“为什么这两个查询的结果集不同,请解释原因?”?没有示例数据很困难,但您有
左连接
s并获得更多行这一事实强烈地暗示了多对一(甚至多对多)关系。在前者中,您正在使用中的
存在
对于子查询,实际上建议使用
而不是中的
),因此不会“创建”额外的行。当然,所有这些都来自猜测。
选择clid,hlid
这可以为hlid生成多行。我想您希望
选择不带clid的distinct hlid
。与
相同,选择cellNo,id
。更改为
选择不同的id
。然后左连接应该是内部连接。@avery_larry非常感谢。你们能在回答部分写下这条评论吗?所以我可以将其标记为答案。抱歉,我将@dbbri comment标记为答案。因为您没有回复。谢谢你的问题是什么?那么你的问题是什么?仅仅是“为什么这两个查询的结果集不同,请解释为什么?”?没有示例数据很困难,但您有
左连接
s并获得更多行这一事实强烈地暗示了多对一(甚至多对多)关系。在前者中,您正在使用
中的
存在
对于子查询,实际上建议使用
而不是中的
),因此不会“创建”额外的行。当然,所有这些都来自猜测。
选择clid,hlid
这可以为hlid生成多行。我想您希望
选择不带cl参考的独特hlid
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
)