我有一张如下表所示的表格:
nodelabel | ipaddr | serviceid
x1 | 1.1.1.1 | 1
x1 | 1.1.1.2 | 2
x1 | 1.1.1.3 | 2
x2 | 2.2.2.1 | 1
x2 | 2.2.2.2 | 3
x3 | 3.3.3.1 | 2
x3 | 3.3.3.2 | 3
我正在尝试编写一个sql查询,它返回serviceid!= 1所有节点,其中结果表应该是这样的(即这是所需的输出)
nodelabel | ipaddr | serviceid
x3 | 3.3.3.1 | 2
x3 | 3.3.3.2 | 3
我已经尝试了很多方法,但我的尝试只是排除了serviceid!= 1的节点,结果表看起来像:
nodelabel | ipaddr | serviceid
x1 | 1.1.1.2 | 2
x1 | 1.1.1.3 | 2
x2 | 2.2.2.2 | 3
x3 | 3.3.3.1 | 2
x3 | 3.3.3.2 | 3
任何提供的想法或帮助表示赞赏!
谢谢
答案 0 :(得分:2)
我认为nodelabel
的所有行service_id
的值都不为not exists
。如果是这样,select t.*
from table t
where not exists (select 1
from table t2
where t2.nodelabel = t.nodelabel and t2.service_id = 1
);
应该做你想做的事情:
{{1}}
答案 1 :(得分:2)
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(nodelabel CHAR(2) NOT NULL
,ipaddr VARCHAR(20) NOT NULL
,serviceid INT NOT NULL
,PRIMARY KEY(nodelabel,ipaddr,serviceid)
);
INSERT INTO my_table VALUES
('x1','1.1.1.1',1),
('x1','1.1.1.2',2),
('x1','1.1.1.3',2),
('x2','2.2.2.1',1),
('x2','2.2.2.2',3),
('x3','3.3.3.1',2),
('x3','3.3.3.1',3);
SELECT x.*
FROM my_table x
LEFT
JOIN my_table y
ON y.nodelabel = x.nodelabel
AND y.serviceid = 1
WHERE y.nodelabel IS NULL;
+-----------+---------+-----------+
| nodelabel | ipaddr | serviceid |
+-----------+---------+-----------+
| x3 | 3.3.3.1 | 2 |
| x3 | 3.3.3.1 | 3 |
+-----------+---------+-----------+