基于列依赖关系的SQL查询

基于列依赖关系的SQL查询,sql,Sql,我必须为一个表编写一个查询,其中有两列,比如id1和id2。在这个查询中,我必须确保id2对于单个id1可以有三个atmost值。我已尝试使用此查询: select id1,id2 from table group by id1,id2 having count(id2)<=3 我没有通过这个查询得到结果。有什么修改吗?你的问题很难理解。。。也许是这个 select id1, id2 from table where (select count(id2) from table where

我必须为一个表编写一个查询,其中有两列,比如id1和id2。在这个查询中,我必须确保id2对于单个id1可以有三个atmost值。我已尝试使用此查询:

select id1,id2
from table
group by id1,id2
having count(id2)<=3

我没有通过这个查询得到结果。有什么修改吗?

你的问题很难理解。。。也许是这个

select id1, id2 from table where (select count(id2) from table where id1 = id1) <= 3

你的问题很难理解。。。也许是这个

select id1, id2 from table where (select count(id2) from table where id1 = id1) <= 3
如果id1、id2对不是唯一的,则可能如下所示:

SELECT t.id1, t.id2
FROM atable t
  INNER JOIN (
    SELECT id1
    FROM atable
    GROUP BY id1
    HAVING COUNT(DISTINCT id2) <= 3
  ) g ON t.id1 = g.id1
GROUP BY t.id1, t.id2
但如果对是唯一的,则外部查询不需要GROUP BY,而内部查询不需要DISTINCT:

SELECT t.id1, t.id2
FROM atable t
  INNER JOIN (
    SELECT id1
    FROM atable
    GROUP BY id1
    HAVING COUNT(id2) <= 3
  ) g ON t.id1 = g.id1
如果id1、id2对不是唯一的,则可能如下所示:

SELECT t.id1, t.id2
FROM atable t
  INNER JOIN (
    SELECT id1
    FROM atable
    GROUP BY id1
    HAVING COUNT(DISTINCT id2) <= 3
  ) g ON t.id1 = g.id1
GROUP BY t.id1, t.id2
但如果对是唯一的,则外部查询不需要GROUP BY,而内部查询不需要DISTINCT:

SELECT t.id1, t.id2
FROM atable t
  INNER JOIN (
    SELECT id1
    FROM atable
    GROUP BY id1
    HAVING COUNT(id2) <= 3
  ) g ON t.id1 = g.id1
请试试这个

选择a.id1、a.id2 从…起 表\u名称a,从表\u中选择count1,id1按具有count*的id1命名组请尝试此

选择a.id1、a.id2 从…起
表\u name a,从表\u name a group by id1中选择count1,id1具有count*更典型的是测试未通过业务规则的行,例如

SELECT DISTINCT *
  FROM Table1
 WHERE EXISTS (
               SELECT T1.id1
                 FROM Table1 AS T1
                WHERE T1.id1 = Table1.id1
                GROUP 
                   BY T1.id1
               HAVING COUNT(*) > 3
              );
其思想是,一旦确定哪些行违反了业务规则并清除了坏数据,您就需要设置一个约束以确保将来不会违反该规则,例如,请注意相同的查询构造:

ALTER TABLE Table1 ADD
   CONSTRAINT atmost_three_id2_values_for_a_single_id1
      CHECK (NOT EXISTS (
                         SELECT T1.id1
                           FROM Table1 AS T1
                          WHERE T1.id1 = Table1.id1
                          GROUP 
                             BY T1.id1
                         HAVING COUNT(*) > 3
                        ));
可悲的是。您可以通过添加序号列来“设计”表级约束,允许您使用常见的唯一和列级检查约束,例如

CREATE TABLE Table1
(
 id1 INTEGER NOT NULL, 
 id2 INTEGER NOT NULL, 
 UNIQUE (id1, id2), 
 seq INTEGER DEFAULT 1 NOT NULL
    CHECK (seq BETWEEN 1 AND 3), 
 UNIQUE (id1, seq)
);

测试未通过业务规则的行更为典型,例如

SELECT DISTINCT *
  FROM Table1
 WHERE EXISTS (
               SELECT T1.id1
                 FROM Table1 AS T1
                WHERE T1.id1 = Table1.id1
                GROUP 
                   BY T1.id1
               HAVING COUNT(*) > 3
              );
其思想是,一旦确定哪些行违反了业务规则并清除了坏数据,您就需要设置一个约束以确保将来不会违反该规则,例如,请注意相同的查询构造:

ALTER TABLE Table1 ADD
   CONSTRAINT atmost_three_id2_values_for_a_single_id1
      CHECK (NOT EXISTS (
                         SELECT T1.id1
                           FROM Table1 AS T1
                          WHERE T1.id1 = Table1.id1
                          GROUP 
                             BY T1.id1
                         HAVING COUNT(*) > 3
                        ));
可悲的是。您可以通过添加序号列来“设计”表级约束,允许您使用常见的唯一和列级检查约束,例如

CREATE TABLE Table1
(
 id1 INTEGER NOT NULL, 
 id2 INTEGER NOT NULL, 
 UNIQUE (id1, id2), 
 seq INTEGER DEFAULT 1 NOT NULL
    CHECK (seq BETWEEN 1 AND 3), 
 UNIQUE (id1, seq)
);

你是说最多还是至少?你的问题得到了至少你是说最多还是至少?您的查询至少得到了支持