1

好吧,我得到的系统是一个非常过时的基于 Ingres 数据库的 ERP 系统。数据库模式是……嗯……不是很好(不是真正规范化),但基本上可以解决。请理解,我无法更改与数据库相关的任何内容。

考虑以下 SQL 语句:

SELECT
  -- some selected fields here
FROM    
    sta_artikelstamm s
    left join sta_chargen c on c.artikel_nr = s.artikel_nr and c.lager != 93
    left join sta_artikelbeschreib b on s.artikel_nr = b.artikel_nr  and b.seite = 25 and b.zeilennr = 1
    left join sta_einkaufskonditionen ek on s.artikel_nr = ek.artikel_nr AND s.lieferant_1 = ek.kunden_nr
    left join sta_kundenstamm ks on ek.kunden_nr = ks.nummer AND ks.nummer = s.lieferant_1
    left join tab_teilegruppe2 tg2 on s.teilegruppe_2 = tg2.teilegruppe
WHERE 
    (s.status = 0)
AND 
    (s.teilegruppe_2 IS NOT NULL) AND (s.teilegruppe_2 != '') 

到目前为止,这按预期工作,我得到了 40742 个结果。结果集看起来不错,数字与我的预期相符,并且声明没有显示重复。我明确使用了 LEFT JOIN,因为相关表中的某些字段可能不包含条目,但我仍想保留主文章表中的信息。

现在,表 tab_teilegruppe2 包含 3 个字段(bezeichnung = 描述,teilegruppe = 部分组 == 主键,taricnr - 请忽略此字段,它可能为空或包含一些值,但我不需要它)。

我虽然添加以下 SQL 部分以仅包含结果集中未出现在特定部分组中的行。因此,我在 SQL 语句的最后添加了以下行。

AND (s.teilegruppe_2 NOT IN (49,57,60,63,64,65,66,68,71,73,76,77,78,79,106,107))

我绝不是 SQL 专家(您可能已经猜到了),但不应该额外的 WHERE 语句删除行而不是添加行吗?只要我在 WHERE 子句中添加这个简单的附加语句,我就会得到 85170 个结果行。

现在我猜它与“NOT IN”语句有关,但我不明白为什么我突然得到比以前更多的行。任何人都可以给我一个指针在哪里寻找我的错误?

4

1 回答 1

2

s.teilegruppe_2柱子的类型是什么?它是整数还是某种字符串 ( VARCHAR)?

(s.teilegruppe_2 != '')表明它是一个字符串,但您的 NOT IN 将它与整数列表进行比较。

如果所涉及的列是字符串,则NOT IN列表将匹配所有值,因为它们都不会匹配整数值。

于 2014-02-23T18:45:40.257 回答