基于列依赖关系的SQL查询
我必须为一个表编写一个查询,其中有两列,比如id1和id2。在这个查询中,我必须确保id2对于单个id1可以有三个atmost值。我已尝试使用此查询:基于列依赖关系的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
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)
);
你是说最多还是至少?你的问题得到了至少你是说最多还是至少?您的查询至少得到了支持