相关疑难解决方法(0)

使用SqlAlchemy和PostgreSQL更新.. LIMIT 1

使用SqlAlchemy,是否可以构建一个只更新第一个匹配行的查询?

就我而言,我需要更新最新的日志条目:

class Log(Base):
    __tablename__ = 'logs'
    id = Column(Integer, primary_key=True)
    #...
    analyzed = Column(Boolean)

session.query(Log)  \
    .order_by(Log.id.desc())  \
    .limit(1)  \
    .update({ 'analyzed': True })
Run Code Online (Sandbox Code Playgroud)

结果如下:

InvalidRequestError:调用limit()时无法调用Query.update()

这是有道理的,因为它UPDATE ... LIMIT 1是一个仅限MySQL的功能(这里给出了解决方案)

但是我如何对PostgreSQL做同样的事情呢?可能,使用子查询方法

python postgresql sqlalchemy sql-update sql-limit

4
推荐指数
1
解决办法
2951
查看次数

有条件地替换 jsonb 列中每行的单个值

我需要一种更有效的方法来更新 Postgres 9.5 中单个表的行。我目前正在使用 pg_dump 执行此操作,并在 Linux 操作系统环境中的搜索和替换操作后使用更新的值重新导入。

table_a有 300000 行,2 列:id bigintjson_col jsonb. json_col有大约 30 个键:“C1”到“C30”,如本例所示:

Table_A

    id,json_col
    1  {"C1":"Paris","C2":"London","C3":"Berlin","C4":"Tokyo", ... "C30":"Dallas"}
    2  {"C1":"Dublin","C2":"Berlin","C3":"Kiev","C4":"Tokyo", ... "C30":"Phoenix"}
    3  {"C1":"Paris","C2":"London","C3":"Berlin","C4":"Ankara", ... "C30":"Madrid"}
    ...
Run Code Online (Sandbox Code Playgroud)

要求是批量搜索从 C1 到 C30 的所有键,然后在它们中查找值“柏林”并替换为“马德里”,并且仅当马德里不重复时。即 id:1 与密钥 C3,和 id:2 与 C2。id:3 将被跳过,因为 C30 已经存在这个值

它必须在 PostgreSQL 9.5 中的单个 SQL 命令中,一次并考虑jsonb列中的所有键。

sql postgresql replace sql-update jsonb

3
推荐指数
1
解决办法
1326
查看次数

从 postgres 的字符串数组列中删除重复条目

我有一个 PostgreSQL 表,其中有一列包含字符串数组。该行有一些唯一的数组字符串,或者一些也有重复的字符串。如果存在,我想从每一行中删除重复的字符串。

我尝试了一些查询,但无法实现。

以下是表格:

  veh_id |             vehicle_types              
 --------+----------------------------------------
      1  | {"byd_tang","volt","viper","laferrari"} 
      2  | {"volt","viper"}                        
      3  | {"byd_tang","sonata","jaguarxf"}        
      4  | {"swift","teslax","mirai"}              
      5  | {"volt","viper"}                        
      6  | {"viper","ferrariff","bmwi8","viper"}   
      7  | {"ferrariff","viper","viper","volt"}    
Run Code Online (Sandbox Code Playgroud)

我期待以下输出:

  veh_id |             vehicle_types              
 --------+----------------------------------------
      1  | {"byd_tang","volt","viper","laferrari"} 
      2  | {"volt","viper"}                        
      3  | {"byd_tang","sonata","jaguarxf"}        
      4  | {"swift","teslax","mirai"}              
      5  | {"volt","viper"}                        
      6  | {"viper","ferrariff","bmwi8"}           
      7  | {"ferrariff","viper","volt"}            
Run Code Online (Sandbox Code Playgroud)

sql arrays postgresql duplicates sql-update

3
推荐指数
1
解决办法
2131
查看次数

将函数动态应用到 Postgres 表中的所有列

使用 Postgres 13.1,我想对表的所有列应用前向填充函数。前向填充函数在我之前的问题中进行了解释:

但是,在这种情况下,列和表是指定的。我想获取该代码并将其应用于任意表,即。指定一个表,并将前向填充应用于每一列。

以此表为例:

CREATE TABLE example(row_num int, id int, str text, val integer);
INSERT INTO example VALUES
  (1, 1, '1a', NULL)
, (2, 1, NULL,    1)
, (3, 2, '2a',    2)
, (4, 2, NULL, NULL)
, (5, 3, NULL, NULL)
, (6, 3, '3a',   31)
, (7, 3, NULL, NULL)
, (8, 3, NULL,   32)
, (9, 3, '3b', NULL)
, (10,3, NULL, NULL)
;
Run Code Online (Sandbox Code Playgroud)

我从该函数的以下工作基础开始。我称之为传递一些变量名。请注意,第一个是名而不是列名。该函数获取表名并创建所有列名的数组,然后输出名称。

create or replace function col_collect(tbl text, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql null dynamic-sql plpgsql

3
推荐指数
1
解决办法
1667
查看次数

PostgreSQL修剪过多的尾随零:键入numeric但表达式是text类型

我正在尝试清除过多的尾随零,我使用了以下查询...

UPDATE _table_ SET _column_=trim(trailing '00' FROM '_column_');
Run Code Online (Sandbox Code Playgroud)

...我收到以下错误:

错误:列"_column_"的表达式是text类型.

我已经玩过引号,因为它通常是文本与数字相比,虽然没有任何运气.

CREATE TABLE语法:

CREATE TABLE _table_ (
 id bigint NOT NULL,
 x bigint,
 y bigint,
 _column_ numeric
);
Run Code Online (Sandbox Code Playgroud)

postgresql

2
推荐指数
2
解决办法
3560
查看次数

PostgreSQL 中的更新顺序

我有一个mysql命令:

 update table_demo SET flag= 1 where flag=0 ORDER BY id ASC LIMIT 10
Run Code Online (Sandbox Code Playgroud)

并且需要在 Postgres 中使用相同的命令,我收到此错误:

错误:语法错误位于或附近'ORDER'

mysql sql postgresql sql-update

1
推荐指数
1
解决办法
2439
查看次数

使用复合键选择DISTINCT

这是我所遇到的问题的简化,但是使用这个例子我想获得给定客户的所有产品记录.给客户可能有很多订单,一些订单可能是同一产品我不想拉回重复的产品.产品表上还有一个复合键.

在一个理想的世界中,这很简单,下面的Query将完成这项工作.但是,由于该表包含nText列,因此SQL Server会抱怨"无法将ntext数据类型选为DISTINCT,因为它不具有可比性."

SELECT distinct p.idA, p.idB, p.descriptionNTEXT
FROM p product, o order, c customer
WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID
Run Code Online (Sandbox Code Playgroud)

我想把它重新组织成类似的东西

SELECT p1.idA, p1.idB, p1.descriptionNTEXT
FROM   p1 product
WHERE (p1.idA, p1.idB) IN
   (
       SELECT p.idA, p.idB
       FROM p product, o order, c customer
       WHERE o.productID = p.idA AND o.subProductID = p.idB AND o.customerID = c.ID
   )
Run Code Online (Sandbox Code Playgroud)

请参阅如何(或可以)在多列上选择DISTINCT?

但是,此方法不适用于SQL Server

有任何想法吗?

理想情况下,我需要一个可移植的解决方案,至少可以在SQLServer,MySQL和Oracle上运行.但DB Specific解决方案总比没有好!

以下数据大致显示了我想要的内容.

Customer
ID name
1  Fred

Order
ID  CustomerID productID …
Run Code Online (Sandbox Code Playgroud)

sql sql-server select distinct composite-primary-key

1
推荐指数
1
解决办法
3643
查看次数

SQL查询以查找具有特定数量关联的行

使用Postgres我有一个有conversations和的模式conversationUsers.每个conversation都有很多conversationUsers.我希望能够找到具有确切指定数量的对话conversationUsers.换句话说,提供了一个userIds(例如[1, 4, 6])我希望能够找到仅包含那些用户的对话的数组,而不是更多.

到目前为止,我试过这个:

SELECT c."conversationId"
FROM "conversationUsers" c
WHERE c."userId" IN (1, 4)
GROUP BY c."conversationId"
HAVING COUNT(c."userId") = 2;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎也回归了包括这两个用户在内的对话.(例如,如果对话还包括"userId"5 ,则返回结果).

sql postgresql sequelize.js relational-division

1
推荐指数
1
解决办法
138
查看次数

基于具有 NULL 值的 UNIQUE 约束的 UPSERT

我有一个 Postgres 表,对多个列有唯一约束,其中一列可以为 NULL。我只希望每个组合都允许该列中的一条记录为 NULL。

create table my_table (
   col1 int generated by default as identity primary key,
   col2 int not null,
   col3 real,
   col4 int,
   constraint ux_my_table_unique unique (col2, col3)
);
Run Code Online (Sandbox Code Playgroud)

我有一个 upsert 查询,当它遇到 col2、col3 中具有相同值的记录时,我想更新 col4:

insert into my_table (col2, col3, col4) values (p_col2, p_col3, p_col4)
on conflict (col2, col3) do update set col4=excluded.col4;
Run Code Online (Sandbox Code Playgroud)

但当 col3 为 NULL 时,冲突不会触发。我读过有关使用触发器的内容。请问,引发冲突的最佳解决方案是什么?

sql postgresql null unique upsert

1
推荐指数
2
解决办法
5625
查看次数

sql选择表的多个列

我正在尝试从oracle DB中的表中进行选择.

如果我在单列上的select语句中做了不同的工作,它可以正常工作,但对于多列,这似乎不起作用.

例如.

select DISTINCT col1, col2, col3, col4, col5, col6 from table1
Run Code Online (Sandbox Code Playgroud)

返回相同的结果.

select * from table1
Run Code Online (Sandbox Code Playgroud)

第2列,第3列具有重复值.我想要的是所有上述列值的值,但不是column2和column3的重复值.

你能帮忙吗?我们将不胜感激.

谢谢

sql oracle select

-2
推荐指数
1
解决办法
8949
查看次数