坚持使用多个连接的SQL查询

时间:2014-02-23 18:05:12

标签: c# sql database ingres

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

1 个答案:

答案 0 :(得分:2)

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

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

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