SQL查询返回行的where子句不存在

问题描述 投票:-2回答:4

我正在对表运行查询以查找缺少的值,请参阅下面的示例。我想要一个返回匹配行以及不匹配行的查询。

select first, last, id
  from sometable
 where id not in (1234, 5678, 918, 123, 345, 567, 789, 901, 111, 222, 333, 444)

+----------+---------+---------+
| Returned | | |
+----------+---------+---------+
| FIRST    | LAST    | ID      |
| Fir      | Las     | 123     |
| Sand     | Mud     | 222     |
| Stud     | Wood    | 345     |
| Nail     | Metal   | 444     |
| Fiber    | Glass   | 567     |
| Max      | Money   | 789     |
| Less     | Piece   | 5678    |
+----------+---------+---------+



+----------+-------+------+
| Expected |       |      |
+----------+-------+------+
| FIRST    | LAST  | ID   |
| Fir      | Las   | 123  |
| Sand     | Mud   | 222  |
| Stud     | Wood  | 345  |
| Nail     | Metal | 444  |
| Fiber    | Glass | 567  |
| Max      | Money | 789  |
| Less     | Piece | 5678 |
|          |       | 1234 |
|          |       | 918  |
|          |       | 901  |
|          |       | 111  |
|          |       | 333  |
+----------+-------+------+
sql oracle
4个回答
0
投票

如果我理解正确,这可能会有效,但添加你想要的条件,你不想要的

    Select id, first,last from sometable
   Where id in ('123','222','345')
   Union
    Select null, null, last from sometable
   Where id in ('345','444')

2
投票

你需要这样的东西

SQL Fiddle demo

select t.id,s.first,s.last
from 
(SELECT regexp_substr(txt, '[^,]+', 1, LEVEL) id
  FROM 
    (SELECT 
        '1234, 5678, 918, 123, 345, 567, 789, 901, 111, 222, 333, 444' AS txt 
     -- Put your in clause above without new line.
        FROM dual
    )  
     CONNECT BY regexp_substr(txt, '[^,]+', 1, LEVEL) IS NOT NULL
) t
left join
sometable s
on t.id=s.id

产量

+------+--------+--------+
|  ID  | FIRST  |  LAST  |
+------+--------+--------+
|  123 | Fir    | Las    |
|  222 | Sand   | Mud    |
|  345 | Stud   | Wood   |
|  444 | Nail   | Metal  |
|  567 | Fiber  | Glass  |
|  789 | Max    | Money  |
| 5678 | Less   | Piece  |
|  111 | (null) | (null) |
| 1234 | (null) | (null) |
|  918 | (null) | (null) |
|  901 | (null) | (null) |
|  333 | (null) | (null) |
+------+--------+--------+

0
投票

您可能无法这样做,因为您只会收到一个列数据而不是整个结果集。

检查表列是否允许为空,如果是,则可以添加异常值(1234,5678,918,123,345,567,789,901,111,222,333,444)并在末尾添加一个简单的插入你的查询。


0
投票

另一个选择:将您感兴趣的ID放入临时表,并进行外连接:

(Sqlite语法;根据需要调整Oracle)

CREATE TABLE sometable(id INTEGER PRIMARY KEY, first TEXT, last TEXT);
-- Populate sometable
CREATE TEMPORARY TABLE temptable(id INTEGER PRIMARY KEY);
INSERT INTO temptable VALUES (1234), (5678), (918), (123), (345), (567), (789),
                             (901), (111), (222), (333), (444);
SELECT first, last, t.id AS id
 FROM temptable AS t
 LEFT OUTER JOIN
      sometable AS s
 ON s.id = t.id;

产生

first       last        id        
----------  ----------  ----------
                        111       
Fir         Las         123       
Sand        Mud         222       
                        333       
Stud        Wood        345       
Nail        Metal       444       
Fiber       Glass       567       
Max         Money       789       
                        901       
                        918       
                        1234      
Less        Piece       5678

编辑:如果需要,您可以使用CTE来保存值而不是临时表。

© www.soinside.com 2019 - 2024. All rights reserved.