【问题标题】:SQLite: replace result values using bijective tableSQLite:使用双射表替换结果值
【发布时间】:2020-02-13 13:03:39
【问题描述】:

在 SQLite 中,我有以下查询

SELECT x.nameIndex, y.nameIndex
FROM relation x, relation y
WHERE x.label=y.label AND x.feature=1 AND y.feature=0;

返回所有具有相同标签的x.nameIndex,y.nameIndex 对,其中x 具有特征1y 具有特征0

现在我有另一个表 index2name 存储每个索引的名称,我可以这样做:

SELECT name FROM index2name WHERE nameIndex=...;

如何更改顶部查询,使其查找相应索引的名称并返回成对的名称?

【问题讨论】:

    标签: sqlite join mapping resultset self-join


    【解决方案1】:

    使用CTE 返回名称而不是索引和relation 中每一行的组(通过连接到index2name)并对其进行自连接:

    WITH cte AS (
      SELECT i.name, r.label, r.feature 
      FROM relation r INNER JOIN index2name i
      ON i.nameIndex = r.nameIndex
    )
    SELECT c1.name, c2.name 
    FROM cte c1 INNER JOIN cte c2
    ON c2.label = c1.label
    WHERE c1.feature=1 AND c2.feature=0;
    

    或者没有CTE:

    SELECT i1.name, i2.name 
    FROM relation r1 INNER JOIN relation r2
    ON r2.label = r1.label
    INNER JOIN index2name i1 ON i1.nameIndex = r1.nameIndex 
    INNER JOIN index2name i2 ON i2.nameIndex = r2.nameIndex 
    WHERE r1.feature=1 AND r2.feature=0;
    

    【讨论】:

    • 哦,我想我不应该在示例中将其称为 .group ;)
    • group 是保留字。您可以在反引号或方括号内使用它。
    • 我意识到,我之前跳过的附加查询词现在让我比预期更难理解如何将它包含在您的 INNER JOIN 示例中。你能根据我的编辑调整你的答案吗?对不起...
    • 出于好奇:您是否看到您建议的两种替代方案之间的性能(复杂性)差异?
    • 如果您的 SQLite 版本支持 CTE,则使用第一个查询。它在可读性、可维护性和我相信效率方面更好,因为任何优化器都更容易设计适当的执行计划。在大多数情况下,我认为它会表现得更好。
    猜你喜欢
    • 2016-01-29
    • 2012-10-03
    • 1970-01-01
    • 2019-12-28
    • 2017-08-23
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多