【问题标题】:Getting two rows "in scope" for a PostgreSQL function call: cross join?为 PostgreSQL 函数调用获取“范围内”的两行:交叉连接?
【发布时间】:2011-11-07 16:14:01
【问题描述】:

我有一个用户定义的函数similarity(),它比较两个用户并返回一个分数。现在,调用查询看起来像:

SELECT similarity(user1, user2)
FROM (
  SELECT users.id
  FROM users AS user1
  WHERE users.id = 123
)
CROSS JOIN
(
  SELECT users.id
  FROM users AS user2
  WHERE users.id = 456
);

这感觉很乱。有没有更好的方法来设置函数调用的两个用户?

【问题讨论】:

    标签: sql postgresql join user-defined-functions


    【解决方案1】:

    如果每个表中只有一个(似乎id 是一个PK)那么

    SELECT similarity((SELECT a FROM users a WHERE a.id=123), 
       (SELECT b FROM users b WHERE b.id=456));
    

    【讨论】:

    • 谢谢 - 这就是我所缺少的(我可以在 SELECT 子句而不是 FROM 子句中进行子查询)。
    【解决方案2】:

    完全相同的简化形式:

    SELECT similarity(a, b)
    FROM   users a, users b
    WHERE  a.id = 123
    AND    b.id = 456;
    

    【讨论】:

    • 我不清楚;子查询在实际查询中是必需的。
    • @JayLevitt 您可以插入子查询来代替表格。请注意,如果两个元组之一不存在,则 Andrews 变体会产生 不同 结果。这就是我选择这种形式的原因。
    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2013-07-11
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2013-09-16
    相关资源
    最近更新 更多