好吧,我得到的系统是一个基于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 = description,teilegruppe = part group == primary key,taricnr - 请忽略此字段,它可能为null或包含一些值,但我不需要它。)< / p>
我将以下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”语句有关,但我不明白为什么我突然得到比以前更多的行。任何人都可以给我一个指针来查找我的错误?
答案 0 :(得分:2)
s.teilegruppe_2
列的类型是什么?它是整数还是某种字符串(VARCHAR
)?
(s.teilegruppe_2 != '')
表明它是一个字符串,但你的NOT IN正在将它与整数列表进行比较。
如果涉及的列是一个字符串,那么NOT IN
列表将匹配所有值,因为它们都不匹配整数值。