查找光盘上缺少文件的PostgreSQL记录,以及光盘上缺少DB记录的文件
我使用的是PostgreSQL 9.6只读副本,无法在其中创建函数或临时表 在一个表中,有一个应该在光盘上的文件列表。在一个完全不同的服务上的目录中,有文件本身,由file_id命名查找光盘上缺少文件的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
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;
您的输出有什么问题?我不明白这个问题。那只是我希望达到的结果。你的回答非常适合我的需要-谢谢,还有一匹没有名字的马。你的输出有什么问题?我不明白这个问题。那只是我希望达到的结果。你的回答完全符合我的需要-谢谢,还有一匹没有名字的马。