【问题标题】:Missing data row in NOT IN clauseNOT IN 子句中缺少数据行
【发布时间】:2014-03-12 15:58:35
【问题描述】:

我刚刚意识到我的自动价格计算没有填写 ListID 4 的价格。 我从如下所示的 SELECT 中插入了价格。

对于错误研究,我执行了没有 WHERE 部分的 SELECT,它向我显示了示例数据行。

我找不到错误,为什么它没有显示在完整的选择中(它没有 ListID = 4 的条目)。

有人能看出我的错误吗?

编辑:只尝试了单独的子选择,它没有显示所请求文章的行。为什么 NOT IN 子句不受这一事实的影响?

【问题讨论】:

    标签: sql-server tsql subquery notin


    【解决方案1】:

    很可能是因为您将artikelnummerauspraegungID 组合在一起。

    我认为您没有考虑到 '100' + '0''10' + '00' 相同的事实。


    与其尝试将两个字段合并为一个,不如尝试以下方法?

    SELECT
      *
    FROM
      #allArticles  AS allArticles
    WHERE
      Artikelnummer = 'IT-810260'
      AND NOT EXISTS (SELECT *
                        FROM KHKPreisListenArtikel
                       WHERE ListeID       = 4
                         AND Artikelnummer = allArticles.Artikelnummer
                         AND Auspraegung   = allArticles.Auspraegung
                     )
    


    如果还是不行,那么你必须在另一个表中有对应的记录,像这样找到它们...

    SELECT
      *
    FROM
      #allArticles            AS allArticles
    INNER JOIN
      KHKPreisListenArtikel   AS Preis
        ON  Preis.ListeID       = 4
        AND Preis.Artikelnummer = allArticles.Artikelnummer
        AND Preis.Auspraegung   = allArticles.Auspraegung
    WHERe
      allArticles.Artikelnummer = 'IT-810260'
    

    请注意

    请不要包含代码图片,请复制代码,以便我们也可以复制。

    特别是当表格/字段是另一种语言时......


    编辑

    这是一个查询,它将显示原始查询失败的原因。

    SELECT
      *
    FROM
      #allArticles            AS allArticles
    INNER JOIN
      KHKPreisListenArtikel   AS Preis
        ON  Preis.ListeID       = 4
        AND Preis.Artikelnummer       + CONVERT(VARCHAR(50), Preis.Auspraegung)
            =
            allArticles.Artikelnummer + CONVERT(VARCHAR(50), allArticles.Auspraegung)
    WHERE
      allArticles.Artikelnummer = 'IT-810260'
    

    【讨论】:

    • 商品编号具有唯一的架构。这不可能是我猜的问题。 IN 运算符是否可能不适用于 varchar 值?
    • 解决方案 2 不起作用,因为我只想要列表 4 中没有价格的文章。解决方案 1 确实有效,非常感谢!
    • @SimonPawlowski - IN 运算符可以正常工作。但是,您的串联仍然是潜在的危险;在您的示例中,您有一行artikelnummer = 'IT-810620', Auspraegung = 0,当连接时您得到composite_key = 'IT-8106200'。如果你在另一个表中有如下记录,那么你就有问题了; artikelnummer = 'IT-8106', Auspraegung = 200 因为这将产生与composite_key = 'IT-8106200' 相同的结果
    • @SimonPawlowski - 解决方案 2 不是解决方案!这是您可以运行的代码来查找任何可能导致第一次查询失败的匹配项!
    • 我知道这样做的风险,我通常会尽量避免,但在这种情况下是不可能发生的。
    猜你喜欢
    • 2011-01-12
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2010-09-12
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多