好吧,我得到的系统是一个非常过时的基于 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”语句有关,但我不明白为什么我突然得到比以前更多的行。任何人都可以给我一个指针在哪里寻找我的错误?