用于返回分组节点的SQL语句

时间:2015-03-25 11:39:43

标签: sql postgresql

我有一张如下表所示的表格:

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

任何提供的想法或帮助表示赞赏!

谢谢

2 个答案:

答案 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 |
+-----------+---------+-----------+