当前位置: 首页 > 面试题库 >

sql:如果另一列在名称空间中引起冲突,则更新一列

邹俊友
2023-03-14
问题内容

我有一个SQL表,其中包含软件包列表(10000个唯一条目的顺序)和任何给定软件包的相应类别(100个唯一条目的顺序)。给定的包可以属于多个类别(15000个唯一组合的顺序,因此是表的大小)的一部分。

所有软件包名称都应该是唯一的,并且不会与类别名称冲突,但是,情况似乎并非如此。

我需要确定10k软件包中的任何一个是否与100个类别中的任何一个都具有相同的名称,如果是,请对所有此类软件包名称进行修改以包含,pkg后缀,以确保可以共享对两个名称空间的访问,并保持独特。

最简单的情况是:

sqlite> select * from categories where value=fullpkgpath;
lang/mono|lang/mono

sqlite> select fullpkgpath, value from categories where fullpkgpath="lang/mono";
lang/mono|devel
lang/mono|lang
lang/mono|lang/mono

应将其转换为以下形式:

lang/mono,pkg|devel
lang/mono,pkg|lang
lang/mono,pkg|lang/mono

但是,也可能存在更多间接冲突(给定的程序包与其不属于的类别冲突),例如:

sqlite> select * from categories where fullpkgpath="lang/erlang" or fullpkgpath="lang/node";
lang/erlang|lang
lang/node|devel
lang/node|lang
lang/node|lang/python

应将其转换为以下形式:

lang/erlang,pkg|lang
lang/node,pkg|devel
lang/node,pkg|lang
lang/node,pkg|lang/python

由于lang/erlanglang/node本身都是类别,因此:

sqlite> select * from categories where value="lang/erlang" limit 8;
databases/erl-Emysql|lang/erlang
databases/erl-couchbeam|lang/erlang
databases/erl-epgsql|lang/erlang
databases/erl-sqerl|lang/erlang
devel/erl-automeck|lang/erlang
devel/erl-bear|lang/erlang
devel/erl-depsolver|lang/erlang
devel/erl-ej|lang/erlang

sqlite> select * from categories where value="lang/node" limit 8;
databases/node-pg|lang/node
databases/node-sqlite3|lang/node
devel/node-async|lang/node
devel/node-bindings|lang/node
devel/node-buffer-writer|lang/node
devel/node-cloned|lang/node
devel/node-expresso|lang/node
devel/node-fibers|lang/node

我在OpenBSD上使用sqlite3和perl。如果需要,该数据库可在ftp上找到。


问题答案:

要检查一个值是否在一组值中,请使用IN:

UPDATE categories
SET fullpkgpath = fullpkgpath || ',pkg'
WHERE fullpkgpath IN (SELECT value
                      FROM categories)


 类似资料:
  • 问题内容: 如果给定的文件名已经在数据库中,我想在表中进行更新,否则我想插入新行。我尝试此代码,但显示的错误请给我正确的方式,因为我在SQL中更新鲜 问题答案: 你应该 在查询中使用 参数 - 总是! - 没有例外 创建一个处理 服务器上零件的单个查询 __ 使用公认的ADO.NET最佳实践将事物放入块等。 试试下面的代码:

  • 问题内容: 考虑以下jfiddle http://jsfiddle.net/bchapman26/9uUBU/29/ 我有2个模块(module1和module2)。module1和module2都定义了一个名为myService的服务。当两个模块都导入myApp时,这似乎在Angular中的myService上创建了名称冲突。看来AngularJs仅使用第二个服务定义,而没有警告您可能的问题。

  • 当尝试使用PostgreSQL执行时,我遇到了一个我不理解的行为。文档似乎指示语句的冲突目标可以是索引表达式或约束名称。但是,当试图引用约束名称时,我得到了一个“列...不存在”错误。 我的第一次尝试是创建一个索引,它可以很好地处理约束推理: 在描述上表时,我在“索引”下看到了以下内容: 我的第二次尝试是将唯一约束显式地放在创建表中: 在描述上表时,“索引:”的输出略有不同(“唯一约束”与前一示例

  • 问题内容: 尝试通过一些非常有限的知识和经验来进行SQL查询。尝试了很多我通过搜索发现的内容,但没有得出我想要的结果。 我有四个表: 回复:KITS-[KIT_NO]和[ITEM_NO]都位于ITEMS表中。它们的串联是PK。 我想选择ORDERS,ORDERS.DATE,ORDER_DETAILS.ITEM_NO,ITEMS.DESC 没问题。一些简单的内部联接,我在路上。 困难在于在selec

  • 我在Postgres 11中有以下表格: 我想在col3列中搜索col4的每个值。如果col4中的值存在于col3中,我想保留其他行,该行应该被排除在外。 期望输出为: 我无法尝试这方面的任何东西,因为我还无法找到解决方案。