查找光盘上缺少文件的PostgreSQL记录,以及光盘上缺少DB记录的文件

查找光盘上缺少文件的PostgreSQL记录,以及光盘上缺少DB记录的文件,sql,postgresql,postgresql-9.6,Sql,Postgresql,Postgresql 9.6,我使用的是PostgreSQL 9.6只读副本,无法在其中创建函数或临时表 在一个表中,有一个应该在光盘上的文件列表。在一个完全不同的服务上的目录中,有文件本身,由file_id命名 Column | Type -----------+----------- file_id | integer name | text 和另一台机器上的光盘 ls -rt /var/www/dbfiles 519288 519290 519297 5192

我使用的是PostgreSQL 9.6只读副本,无法在其中创建函数或临时表

在一个表中,有一个应该在光盘上的文件列表。在一个完全不同的服务上的目录中,有文件本身,由file_id命名

  Column   |   Type
-----------+-----------
 file_id   |  integer
 name      |  text
和另一台机器上的光盘

ls -rt /var/www/dbfiles
519288     519290     519297     519298     519231     ...
大约有5000条记录和5000个文件,但我有理由相信它们不匹配。因此,我试图找到一种方法来运行一个查询,该查询将显示数据库中的哪些记录在磁盘上没有文件,以及磁盘上的哪些文件在数据库中没有记录。现在这是一次性的,所以我不介意对目录列表进行一定程度的人工搜索

如果我可以将目录列表导入到一个表中,我只需进行外部联接,并在每一侧查找空值。有没有一种方法可以对外连接一个充满ID的子查询?差不多

SELECT f.name, dir_listing.id FROM files f
FULL OUTER JOIN (SELECT (519288, 519290, 519297, 519298, 519231...) AS id) AS dir_listing
输出看起来像什么

 name          |   id
---------------+---------
 myfile.txt    | 519288
 otherfile.txt | 
               | 519290 
(等)

从CSV和VLOOKUP中救我

您可以使用
值()

您可以使用
值()


你的想法行得通,只是使用了错误的语法

这句话:

SELECT (519288, 519290, 519297, 519298, 519231...)
返回包含一列的单行,该列是包含许多字段的匿名记录

您可以做的是在values子句中列出ID(从INSERT语句可知):

请注意,每个值都用括号括起来,为每个值在行上创建

如果您想少键入一点,可以使用一个未列出的数组常量:

SELECT f.name, dir_listing.id 
FROM files f
  FULL JOIN unnest(array[519288, 519290, 519297, 519298, 519231...]) AS dir_listing(id) 
         on f.id = dir_listing.id;

你的想法行得通,只是使用了错误的语法

这句话:

SELECT (519288, 519290, 519297, 519298, 519231...)
返回包含一列的单行,该列是包含许多字段的匿名记录

您可以做的是在values子句中列出ID(从INSERT语句可知):

请注意,每个值都用括号括起来,为每个值在行上创建

如果您想少键入一点,可以使用一个未列出的数组常量:

SELECT f.name, dir_listing.id 
FROM files f
  FULL JOIN unnest(array[519288, 519290, 519297, 519298, 519231...]) AS dir_listing(id) 
         on f.id = dir_listing.id;

您的输出有什么问题?我不明白这个问题。那只是我希望达到的结果。你的回答非常适合我的需要-谢谢,还有一匹没有名字的马。你的输出有什么问题?我不明白这个问题。那只是我希望达到的结果。你的回答完全符合我的需要-谢谢,还有一匹没有名字的马。