Sql 需要获取Oracle中字段集的否定
我试图一次得到多个字段的否定,下面是我写的Sql 需要获取Oracle中字段集的否定,sql,oracle,Sql,Oracle,我试图一次得到多个字段的否定,下面是我写的 orig_code send_id ref_no ABCD001 ABCD001 35RE777 ABCDXXX ABCDXXX 35RE156 ABCD001 ABCD001 20PS789 ABCDXXX ABCDXXX 20PS453 ABCD001 ABCD001 30RE745 ABCDXXX ABCDXXX 55RE741 DBWS001 ABCD001 25PS369 MNKSXXX ABCDXXX 21P
orig_code send_id ref_no
ABCD001 ABCD001 35RE777
ABCDXXX ABCDXXX 35RE156
ABCD001 ABCD001 20PS789
ABCDXXX ABCDXXX 20PS453
ABCD001 ABCD001 30RE745
ABCDXXX ABCDXXX 55RE741
DBWS001 ABCD001 25PS369
MNKSXXX ABCDXXX 21PS258
ABCD001 ABCD001 25PS369
ABCDXXX ABCDXXX 21PS258
SELECT *
FROM T1
WHERE
((orig_code, send_id) NOT IN
( ('ABCD001', 'ABCD001'),
('ABCDXXX', 'ABCDXXX'))
AND (ref_no NOT LIKE '35RE%' OR ref_no NOT LIKE '20PS%'))
我编写的查询没有删除上表中的内容。请让我知道我在哪里犯的错误
我正在寻找的结果如下。可能有多种参考格式,我只包括了少数。我只需要删除那些以35RE或20PS开头的代码,同时满足orig_代码和send_id字段值
ABCD001 ABCD001 30RE745
ABCDXXX ABCDXXX 55RE741
DBWS001 ABCD001 25PS369
MNKSXXX ABCDXXX 21PS258
ABCD001 ABCD001 25PS369
ABCDXXX ABCDXXX 21PS258
谢谢你的帮助
Oracle 11g R2架构设置:
问题1:
查询2或使用NOTA和NOTB=非A或B以及NOTA或NOTB=非A和B:
:
根据您最近的示例,这就足够了:
SELECT *
FROM T1
WHERE ref_no NOT LIKE '35RE%'
and ref_no NOT LIKE '20PS%'
使用您的数据:
with T1(orig_code, send_id, ref_no) as (
select 'ABCD001', 'ABCD001', '35RE777' from dual union all
select 'ABCDXXX', 'ABCDXXX', '35RE156' from dual union all
select 'ABCD001', 'ABCD001', '20PS789' from dual union all
select 'ABCDXXX', 'ABCDXXX', '20PS453' from dual union all
select 'ABCD001', 'ABCD001', '30RE745' from dual union all
select 'ABCDXXX', 'ABCDXXX', '55RE741' from dual union all
select 'DBWS001', 'ABCD001', '25PS369' from dual union all
select 'MNKSXXX', 'ABCDXXX', '21PS258' from dual union all
select 'ABCD001', 'ABCD001', '25PS369' from dual union all
select 'ABCDXXX', 'ABCDXXX', '21PS258' from dual
)
SELECT *
FROM T1
WHERE ref_no NOT LIKE '35RE%'
and ref_no NOT LIKE '20PS%'
ORIG_CODE SEND_ID REF_NO
--------- ------- -------
ABCD001 ABCD001 30RE745
ABCDXXX ABCDXXX 55RE741
DBWS001 ABCD001 25PS369
MNKSXXX ABCDXXX 21PS258
ABCD001 ABCD001 25PS369
ABCDXXX ABCDXXX 21PS258
如果对该数据运行带有WHERE条件的查询,则不会得到任何数据。你会期望什么呢?我没有复制粘贴所有的查询内容。只是其中的一部分。我有select、from和where子句:。无论如何,我已经更新了这个问题。这已经足够清楚了。我的问题是:你的预期结果是什么?我已经更新了表格和预期结果。希望能有帮助。谢谢MT0,这解决了我的问题。我现在正在处理总查询。希望这之后一切都会好起来。再次感谢。
SELECT *
FROM t1
WHERE NOT (
(orig_code, send_id) IN (
('ABCD001', 'ABCD001'),
('ABCDXXX', 'ABCDXXX')
)
AND (
ref_no LIKE '35RE%'
OR ref_no LIKE '20PS%'
)
)
| ORIG_CODE | SEND_ID | REF_NO |
|-----------|---------|---------|
| ABCDXXX | ABCDXXX | 25PS453 |
| ABCD001 | ABCD001 | 30RE745 |
| ABCDXXX | ABCDXXX | 55RE741 |
| ABCD001 | ABCD001 | 25PS369 |
| ABCDXXX | ABCDXXX | 21PS258 |
SELECT *
FROM T1
WHERE ref_no NOT LIKE '35RE%'
and ref_no NOT LIKE '20PS%'
with T1(orig_code, send_id, ref_no) as (
select 'ABCD001', 'ABCD001', '35RE777' from dual union all
select 'ABCDXXX', 'ABCDXXX', '35RE156' from dual union all
select 'ABCD001', 'ABCD001', '20PS789' from dual union all
select 'ABCDXXX', 'ABCDXXX', '20PS453' from dual union all
select 'ABCD001', 'ABCD001', '30RE745' from dual union all
select 'ABCDXXX', 'ABCDXXX', '55RE741' from dual union all
select 'DBWS001', 'ABCD001', '25PS369' from dual union all
select 'MNKSXXX', 'ABCDXXX', '21PS258' from dual union all
select 'ABCD001', 'ABCD001', '25PS369' from dual union all
select 'ABCDXXX', 'ABCDXXX', '21PS258' from dual
)
SELECT *
FROM T1
WHERE ref_no NOT LIKE '35RE%'
and ref_no NOT LIKE '20PS%'
ORIG_CODE SEND_ID REF_NO
--------- ------- -------
ABCD001 ABCD001 30RE745
ABCDXXX ABCDXXX 55RE741
DBWS001 ABCD001 25PS369
MNKSXXX ABCDXXX 21PS258
ABCD001 ABCD001 25PS369
ABCDXXX ABCDXXX 21PS258