如何使用SQL从数据库获取一条记录并获得该记录的所有警告?

时间:2019-01-28 06:12:31

标签: sql postgresql

我有两个表

记录 错误

在我们要存储的记录表,json文档中以及在错误表中,如果该json的(业务)验证期间,我们存储警告和错误(如果有的话)。

现在我需要实现,就像我们需要发送记录和该记录的警告(如果错误表中的记录存在)

我编写查询时

SELECT records.record as record,errors.description as warning FROM records as records
  INNER JOIN  errors as errors
  ON records.track_num=errors.track_num
where records.lading_number='123456789'

对于此查询,其结果类型低于

record      warning
<<record>>  <<warning1>>
<<record>>  <<warning2>>
<<record>>  <<warning3>>
<<record>>  <<warning4>>
<<record>>  <<warning5>>

因此,在“记录”列中,它是相同的json文档,但在“警告”列中,它列出了针对该记录的所有警告

此结果从db返回到应用程序,这里我需要的是他们无论如何我们都可以编写sql查询,以便它仅返回一个记录实例和所有警告列表(如果存在)。谁能帮忙。

Environment :
  spring boot
  postgres V10.5

1 个答案:

答案 0 :(得分:0)

您不想将单个警告添加到记录中,而是希望添加警告块:

SELECT r.record, e.warnings 
FROM records r
INNER JOIN
(
  SELECT track_num, STRING_AGG(description, '; ') AS warnings
  FROM errors
  GROUP BY track_num
) e ON e.track_num = r.track_num
where r.lading_number = 123456789;

这用分号和空格分隔警告。如果要使用CR / LF,请使用E'\r\n'。或其他任何分隔符。

STRING_AGG的替代方法是ARRAY_AGG,前提是您的应用可以处理它。

如果您还想显示没有警告的记录,请使用LEFT JOIN代替INNER JOIN