SQL逻辑帮助-返回特定值,但不包括包含相同类型数据的多列中的值

SQL逻辑帮助-返回特定值,但不包括包含相同类型数据的多列中的值,sql,logic,informix,Sql,Logic,Informix,我有一个包含以下列的表: 我的桌子 ID| C1 | C2 | C2 | ------------------ 1 | 111| 333| 111| 2 | 222| 333| 222| 3 | 333| 333| 444| 4 | 444| 111| 222| 5 | 555| 111| 444| 6 | 111| 222| 111| 7 | 333| 555| 333| 8 | 555| 555| 222| 9 | 222| 111| 555| 10| 444| 111| 222| 11|

我有一个包含以下列的表:

我的桌子

ID| C1 | C2 | C2 |
------------------
1 | 111| 333| 111|
2 | 222| 333| 222|
3 | 333| 333| 444|
4 | 444| 111| 222|
5 | 555| 111| 444|
6 | 111| 222| 111|
7 | 333| 555| 333|
8 | 555| 555| 222|
9 | 222| 111| 555|
10| 444| 111| 222|
11| 777| 888| 999|
我希望在C1、C2和C3列中显示包含值111、222和444的记录,但如果这些列中的任何一列包含以下值,我不希望显示这些记录:333、555

因此,我的结果集应该是:

4 | 444| 111| 222| 
6 | 111| 222| 111| 
10| 444| 111| 222|
我一直在绞尽脑汁试图得到这个结果集,但它对我的工作不起作用。我正在使用Informix v12

我尝试了这些方法,但它们不起作用,并且不正确:

select ID, C1, C2, C3
from MyTable
where (C1 in (111, 222, 444) 
       OR C2 in (111, 222, 444) 
       OR C3 in (111, 222, 444)
       )
AND (C1 NOT IN (333, 555) 
     OR C2 NOT IN (333, 555) 
     OR C3 NOT IN (333, 555)
    )

我对SQL一点也不陌生,但我的大脑今天似乎不工作了。如有任何意见,将不胜感激

EDIT在MyTable中添加了额外的行,以包含一条不包含任何指定值的记录,并包含我尝试的另一个示例

您可以从cte(在此处收集有效数据)中获益,以消除您不需要的数据,如下所示:

CREATE TABLE mytable
    (
      number INT,
      score1 INT,
      score2 INT,
      score3 INT
    )

INSERT  INTO mytable VALUES  (1, 111,333,111)
INSERT  INTO mytable VALUES  (2, 222,333,222)
INSERT  INTO mytable VALUES  (3, 333,333,444)
INSERT  INTO mytable VALUES  (4, 444,111,222)
INSERT  INTO mytable VALUES  (5, 555,111,444)
INSERT  INTO mytable VALUES  (6, 111,222,111)
INSERT  INTO mytable VALUES  (7, 333,555,333)
INSERT  INTO mytable VALUES  (8, 555,555,222)
INSERT  INTO mytable VALUES  (9, 222,111,555)
INSERT  INTO mytable VALUES  (10, 444,111,222)
INSERT  INTO mytable VALUES  (11, 777,888,999)

CREATE TEMP TABLE TABLE_TMP (number int) with NO LOG;

INSERT INTO TABLE_TMP
select number
from mytable
where score1 not in (111,222,444)
   or score2 not in (111,222,444)
   or score3 not in (111,222,444)

select *
from mytable m
where not exists (select * from TABLE_TMP t where t.number=m.number)
您可以从cte(在此处收集有效数据)中获益,以消除您不需要的数据,如下所示:

CREATE TABLE mytable
    (
      number INT,
      score1 INT,
      score2 INT,
      score3 INT
    )

INSERT  INTO mytable VALUES  (1, 111,333,111)
INSERT  INTO mytable VALUES  (2, 222,333,222)
INSERT  INTO mytable VALUES  (3, 333,333,444)
INSERT  INTO mytable VALUES  (4, 444,111,222)
INSERT  INTO mytable VALUES  (5, 555,111,444)
INSERT  INTO mytable VALUES  (6, 111,222,111)
INSERT  INTO mytable VALUES  (7, 333,555,333)
INSERT  INTO mytable VALUES  (8, 555,555,222)
INSERT  INTO mytable VALUES  (9, 222,111,555)
INSERT  INTO mytable VALUES  (10, 444,111,222)
INSERT  INTO mytable VALUES  (11, 777,888,999)

CREATE TEMP TABLE TABLE_TMP (number int) with NO LOG;

INSERT INTO TABLE_TMP
select number
from mytable
where score1 not in (111,222,444)
   or score2 not in (111,222,444)
   or score3 not in (111,222,444)

select *
from mytable m
where not exists (select * from TABLE_TMP t where t.number=m.number)

你把
搞混了,用
代替了逗号

select *
from mytable
where
(
     c1 in (111, 222, 444) 
  or c2 in (111, 222, 444) 
  or c3 in (111, 222, 444)
)
and c1 not in (333, 555) 
and c2 not in (333, 555) 
and c3 not in (333, 555);
或:


Rextester演示:

你被
搞混了,用
代替了逗号

select *
from mytable
where
(
     c1 in (111, 222, 444) 
  or c2 in (111, 222, 444) 
  or c3 in (111, 222, 444)
)
and c1 not in (333, 555) 
and c2 not in (333, 555) 
and c3 not in (333, 555);
或:



Rextester演示:

谢谢@eray我知道你在那里做什么了。我已编辑了我的原始帖子,以包含一个额外的行,该行不包含我试图包含或忽略的任何值,以更好地表示我的问题。我已将该行添加到示例数据集中,并运行相同的查询(更新了我的答案),对我来说仍然正常吗?不适合你@分贝_G@ErayBalkanli不幸的是,Informix仍然不支持CTE。必须使用其他等效的构造。@LuísMarques感谢您的评论。您现在可以检查我的答案是否适用于informix吗?@ErayBalkanli要在informix中工作,它必须是
INSERT INTO TABLE\u TMP从mytable中选择number,其中…
,否则您的答案会给出预期的结果:列号为4、6和10的行。谢谢@eray我知道您在那里做什么了。我已编辑了我的原始帖子,以包含一个额外的行,该行不包含我试图包含或忽略的任何值,以更好地表示我的问题。我已将该行添加到示例数据集中,并运行相同的查询(更新了我的答案),对我来说仍然正常吗?不适合你@分贝_G@ErayBalkanli不幸的是,Informix仍然不支持CTE。必须使用其他等效的构造。@LuísMarques感谢您的评论。您现在可以检查我的答案是否适用于informix吗?@ErayBalkanli要在informix中工作,它必须是
INSERT INTO TABLE\u TMP从mytable中选择number,其中…
,否则您的答案会给出预期的结果:列号分别为4、6和10的行。请立即尝试!安培是一个打字错误:)为了记录在案,这是有效的!谢谢你@ThorstenKettner!现在试试这个!安培是一个打字错误:)为了记录在案,这是有效的!谢谢你@ThorstenKettner!在你的AND子句中,用AND更改所有OR。我已经尝试过了,但仍然没有给我我想要的结果。发布你的代码。另外,我注意到您在where子句中使用了ambersands(&),只需要逗号(111222444)和符号,这是一个复制粘贴错误。已修复。请尝试我的答案,如果有帮助,请告诉我。在AND子句中,使用AND更改所有OR。我已尝试过此操作,但仍然没有提供我要查找的结果。发布您的代码。另外,我注意到您在where子句中使用了ambersands(&),只需要逗号(111222444)和符号,这是一个复制粘贴错误。修正了。试试我的答案,如果有帮助请告诉我。