【问题标题】:How to get at the information from a SQLite table containing two foreign keys referencing the same column如何从包含引用同一列的两个外键的 SQLite 表中获取信息
【发布时间】:2018-10-03 13:08:41
【问题描述】:

作为个人项目的一部分,我构建了一个数据库,其中包含一个文本文件表(以它们的路径和基本名称作为列)和另一个表,该表指示哪些文件是其他文件的副本。

这是第一个表格的外观:

files(
         filesid INTEGER PRIMARY KEY UNIQUE,
         filename TEXT,
         filesource TEXT,
         path TEXT UNIQUE)

这是第二个:

duplicatefiles(
            id INTEGER PRIMARY KEY UNIQUE,
            filesid INTEGER,
            duplicateof INTEGER,
            songid INTEGER,
            FOREIGN KEY(filesid) REFERENCES lyricsfiles(filesid),
            FOREIGN KEY(duplicateof) REFERENCES lyricsfiles(filesid),

最后一张表有两列外键引用files表中的id,表示这两个文件是重复的。

我这样做是为了最大程度地减少信息重复,但我现在意识到我不知道如何查询此表以获得我真正想要的内容,即两个文件的路径。 我已经阅读了有关别名的信息,但在这种情况下我无法找到有关如何使用它们的文档。

我正在使用 sqlite3 和 python3。

所以我的问题是:查询数据库以获得所需信息的正确方法是什么?在数据库中表示这些信息的更好方法是什么?

【问题讨论】:

  • 为什么不直接在原始表中添加一列(例如:parent_filesid)而不是两个表?重复文件的文件 ID 会有所不同吗?
  • 我对 TSQL 比较熟悉(也许 sqlite3 也是如此),但你不能只使用 JOIN 语句吗?

标签: sql python-3.x sqlite


【解决方案1】:

您需要加入您的餐桌files 2 次。为此,您需要表别名:

SELECT
  ORI.filesid original_filesid
 ,ORI.filename original_filename
 ,ORI.filesource original_filesource
 ,DUP.filesid duplicate_filesid
 ,DUP.filename duplicate_filename
 ,DUP.filesource duplicate_filesource
FROM duplicatefiles DPF
JOIN files ORI
ON ORI.filesid = DPF.duplicateof
JOIN files DUP
ON DUP.filesid = DPF.filesid

你看到我加入了files 作为别名ORI,表明这个别名代表原始文件(另见加入条件ORI.filesid = DPF.duplicateof)。重复项通过表别名 DUP 连接。然后使用别名选择所需的字段,也可以重命名它们以便更好地理解 ORI.filesid 重命名为 original_filesid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多