【问题标题】:SQL - Unable to exclude data using NOT EXISTSQL - 无法使用 NOT EXIST 排除数据
【发布时间】:2015-11-20 14:48:18
【问题描述】:

我有 3 个连接在一起的表和一个表 NSR_Details,其中包含要在 3 个表的选择中排除的项目。

我可以排除从NSR_details 引用的详细信息,但是当我使用LIKE 搜索时,它仍会返回排除的数据。这是我的查询:

SELECT b.MainID
    ,a.Description
    ,b.ItemID
    ,b.Size
    ,c.Current_SRP
    ,b.Barcode
FROM IMF_SKU AS b
LEFT JOIN IMF_Main AS c ON c.MainID = b.MainID
LEFT JOIN IMF_Extensions AS a ON a.MainID = b.MainID
WHERE (a.Description LIKE 'BBB')
    OR (b.Barcode LIKE 'BBB')
    AND NOT EXISTS (
        SELECT *
        FROM INV_SKU_NSR_DetailsRepo
        )

所以在 NSR_Details 我有 AAA 和 BBB 数据要排除,(其他有 AAA 和 BBB 详细信息以及 CCC、DDD、EEE 等不在 NSR_details 中。我只想在填写条件时排除 AAA 和 BBB WHERE 条件。如果有人问,我将使用 SSMS 作为我的 DBMS。

【问题讨论】:

  • NOT EXISTS 子查询需要在 WHERE 子句中引用主查询。
  • 像这样在 WHERE 子句中具有 LEFT JOIN 的右侧表条件,使得 LEFT JOIN 作为常规 INNER JOIN 执行。移动到 ON 以获得真正的左连接行为。
  • 为什么 LIKE 不带任何通配符?
  • 你明白,但我们不明白 -- INV_SKU_NSR_DetailsRepo 表如何定义要排除的内容 -- 字段名称是什么,这些字段必须匹配哪些字段才能显示排除 -- 等等。我们需要详细信息。

标签: sql sql-server


【解决方案1】:

根据评论

NSR_DetailsRepo 有一个字段与 Main、SKU 保存相同的数据 和扩展。我只想从 main、sku 和 不在 NSR_details 表中的扩展。

如果字段是依赖的,我相信你想要这个

SELECT b.MainID
    ,a.Description
    ,b.ItemID
    ,b.Size
    ,c.Current_SRP
    ,b.Barcode
FROM IMF_SKU AS b
LEFT JOIN IMF_Main AS c ON c.MainID = b.MainID
LEFT JOIN IMF_Extensions AS a ON a.MainID = b.MainID
LEFT JOIN INV_SKU_NSR_DetailsRepo nsr on
         nsr.Description = a.Description and
         nsr.Barcode = b.Barcode
WHERE ((a.Description LIKE 'BBB')
    OR (b.Barcode LIKE 'BBB'))
   AND nsr.Description is null

如果字段是独立的,则为这个

SELECT b.MainID
    ,a.Description
    ,b.ItemID
    ,b.Size
    ,c.Current_SRP
    ,b.Barcode
FROM IMF_SKU AS b
LEFT JOIN IMF_Main AS c ON c.MainID = b.MainID
LEFT JOIN IMF_Extensions AS a ON a.MainID = b.MainID
LEFT JOIN INV_SKU_NSR_DetailsRepo nsr on
         nsr.Description = a.Description or
         nsr.Barcode = b.Barcode
WHERE ((a.Description LIKE 'BBB')
    OR (b.Barcode LIKE 'BBB'))
   AND nsr.Description is null

这是可行的,因为检查连接表是否为空的 LEFT JOIN 与 NOT IN 构造相同。

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多