SQL NOT EXIST 在查询结果中返回重复值

Posted

技术标签:

【中文标题】SQL NOT EXIST 在查询结果中返回重复值【英文标题】:SQL NOT EXIST returning duplicate value in query results 【发布时间】:2018-03-20 16:12:42 【问题描述】:

嗨,似乎从这个 sql 代码中得到了重复,它假设在 BO Data 上找到不在 Order Data上的记录> 使用以下作为键 Keyorderstatus 我所有的查询结果都在 Order Data已经,如何解决这个问题?

SELECT Keyorderstatus, 
OrderNumber, 
PartsNo, 
HoldType, 
ShiptoCode, 
BackOrderQty, 
OrderStatusCode
FROM [BO Data]
WHERE NOT EXISTS (SELECT *
                  FROM [BO Data]
                  WHERE [BO Data].Keyorderstatus = [Order Data].Keyorderstatus
                 ) 
AND [BO Data].OrderStatusCode="AWAITING_SHIPPING"
AND NOT EXISTS (SELECT *
                FROM [Order Data]
                WHERE Keyorderstatus IS NULL);

【问题讨论】:

这将很难,因为我们不知道您的数据是什么样的。如果您要删除欺骗,请尝试在您的 SELECT 之后抛出 DISTINCT。 这一行:WHERE [BO Data].Keyorderstatus = [Order Data].Keyorderstatus使用了[Order Data]表,但是这个表不包含在同一个select中,会重复数据 第二个NOT EXISTS不相关?第一个应该返回一个错误消息,因为它使用的是来自不同表的列。 您好,感谢@dfundako 的快速响应,我将在该代码中的何处使用 DISTINCT。 @RicardoPontual 感谢您的修改,它非常有效,我发现它在查询中复制记录的原因最初我要求它检查“ WHERE NOT EXISTS (SELECT * FROM [BO Data ]' 应该是 '[Order Data]' 来解决我的所有问题,感谢所有关于此问题的建议。 【参考方案1】:

正如@dfundako 所说 - 没有数据表来测试很难检查。

我认为这个 SQL 应该做你所追求的:

SELECT        [BO Data].KeyOrderStatus
            , OrderNumber
            , PartsNo
            , HoldType
            , ShipToCode
            , BackOrderQty
            , [BO Data].OrderStatusCode
FROM        [BO Data] LEFT JOIN [Order Data] ON [BO Data].KeyOrderStatus <> [Order Data].KeyOrderStatus
WHERE       [BO Data].OrderStatusCode = 'AWAITING SHIPPING'
GROUP BY    [BO Data].KeyOrderStatus
            , [BO Data].OrderStatusCode  

检查[Order Data].KeyOrderStatus IS NULL 可能没有必要,因为(我假设)[BO Data].KeyOrderStatus 是主键,因此它必须始终包含一个值,并且 SQL 检查该值是否与 [Order Data] 中的值不同 - 如果是NULL它会不同于PK。

编辑:我已在与联接无关的其他字段中添加。你必须对这些进行分组。

【讨论】:

以上是关于SQL NOT EXIST 在查询结果中返回重复值的主要内容,如果未能解决你的问题,请参考以下文章

sql SQL Server和Oracle SQL的SQL语法的一些示例

sql MS SQL动态SQL

sql sql6.sql

sql sql5.sql

sql SQL - 测试1..sql

sql sql.sql