很抱歉,我不能用一句话来定义我需要什么,部分原因是我不完全理解这个问题,因为这种SQL超出了我的理解. 这是我在另一个帖子中发布的一个问题的扩展,该问题已被解决here

长话短说,我有一张挂锁桌子.每个挂锁都有一组打开它所需的特定锁.锁位于单独的表中.给定一个 keys 类型(可以打开特定的锁),我正在搜索可以用 keys 解锁的所有可能的锁(请注意,像"KL,KL"这样的双锁不能用只能解锁一个"KL"的 keys 解锁.所以,我让这一切运转起来(多亏了@danBlack)

所以,看一看公认的答案,我有以下几点

挂锁表

create table paddocks (
pd char(1),
sz enum('Small', 'Big'),
key (sz));
insert into paddocks values
('A', 'Small'),
('B', 'Small'),
('C', 'Small'),
('D', 'Small'),
('E', 'Small'),
('F', 'Big')

锁表

create table locks (
pd char(1),
lk char(2),
key (pd,lk));
insert into locks values ('A', 'KL'),('A', 'OK'),('A', 'CZ'),('A', 'CZ'),
('B', 'OK'),('B', 'OK'),
('C', 'OK'),('C', 'CZ'), ('C', 'KL'),
('D', 'RO'),('D', 'CZ'), ('D', 'CZ'),
('E', 'OK'),('E', 'OK'), ('E', 'KL'), ('E', 'KL'),
('F', 'OK'),('F', 'OK'), ('F', 'CZ'), ('F', 'KL');

一把 keys

create temporary table ky (
lk char(2),
key (lk));
insert into ky values
('KL'),('OK'),('CZ'),('OK'),('CZ')

目标是找到所有离被给定 keys 打开只有一把锁的挂锁.特别是,我需要在结果中显示挂锁"D",因为它需要一个"RO"锁,而给定的 keys 没有,但它是"1锁距离"被打开的.

SELECT pd
FROM
  (SELECT pd,
          p.lk,
          p.c,
          count(ky.lk) AS kc
   FROM
     (SELECT pd,
             locks.lk AS lk,
             count(locks.lk) AS c
      FROM paddocks
      JOIN locks USING (pd)
      WHERE sz = 'Small'
      GROUP BY pd,
               locks.lk) p
   LEFT JOIN ky USING (lk)
   GROUP BY pd,
            lk) p
GROUP BY pd
HAVING count(pd) = sum(c <= kc)

这将返回挂锁"A"、"B"和"C",因为它们都可以用给定的 keys 打开.缺少的是挂锁"D",它需要"RO"锁. 我想,根据参数的不同,我需要完全匹配(就像它目前正在工作),或者完全匹配+带有"1-lock away"的匹配.)

推荐答案

前面的答案已经做出了大部分计算.最后的having条款需要针对更新后的要求进行更改.

在查询的末尾,sum(c)表示围场需要的锁数.要查看用户拥有的相关密钥的数量是sum(least(c,kc)).least在那里,这样一种锁类型的多余锁不会溢出到另一种锁类型.带着原来的问题.having sum(c) = sum(least(c,kc))也是一个可以接受的答案.

要得到缺少一把 keys 的箱子,要花having sum(c) - 1 = sum(least(c,kc))英镑.

要获得正确数量的 keys /锁或短了一把 keys 的情况,表达式应该是having sum(c) - 1 <= sum(least(c,kc)).

参考fiddle

Sql相关问答推荐

Postgresql在加入时显示重复的行

Postgresql -如何计算刷卡和刷卡时间

如何并行SELECT和RESET?

如何在幂函数中正确使用Power()和Exp()

如何在presto/SQL中使用两个数组列创建(分解)单独的行

解析SQL Server中的嵌套JSON

如何查找所提供日期范围的所有季度开始日期和结束日期

SQL:如何查找聚合满足条件的连续日期

查询页面推荐

SQL按日期分组字段和如果日期匹配则求和

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

我需要一个regexp_like来只验证字母D或T、数字和管道

明细表中没有记录如何更新主表的值为0

在Athena中使用regexp提取括号前的字符串值

Postgres jsonpath运算符的变量替换,如_regex?

将具有嵌套 XML 的列转换为 SQL 中的表格格式?

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

具有关联统计信息 N+1 的 Rails 6 索引资源?

创建一个将层次 struct 级别放入列中的查询

Postgres 窗口函数未按预期工作