【问题标题】:SQL/PSQL Referencing column names in the where clause after cross joining the same table with each otherSQL/PSQL 交叉连接同一张表后在where子句中引用列名
【发布时间】:2017-11-02 01:58:31
【问题描述】:

我试图弄清楚当您将表与自身交叉连接时,如何从交叉连接中引用某些列。整个交叉连接表也有一个别名,这就是为什么我无法访问列名的原因,因为它也与另一个子查询自然连接。 代码如下:

select q0.sid, q0.sname 
from (buys t1 cross join student s3 cross join student s4) q0 natural join 
     (select s5.sid, s5.sname, s6.sid, s6.sname, t3.sid, t3.bookno                                                                      
      from buys t2 cross join student s5 cross join student s6 cross join buys t3                                                                       
      where t2.sid = s5.sid and t3.bookno = t2.bookno) q1
where t1.sid = s3.sid;

问题在于尝试比较 t1.sid 和 s3.sid 的“where”子句,因为 q0.sid 不明确。如何从交叉连接访问这些列?

【问题讨论】:

  • 使用列alias,例如SELECT s5.sid AS s5_sid, s6.sid AS s6_sid
  • 这不是问题所在。我无法访问第一个交叉连接中的 t1.sid 和 s3.sid 以获取最后的 where 类
  • 你需要重构(buys t1 cross join student s3 cross join student s4)。像(SELECT t1.sid AS t1_sid, s3.sid AS s3_sid, s4.sid AS s4_sid FROM buys t1 CROSS JOIN student s3 CROSS JOIN student s4 这样的东西怎么样?

标签: sql postgresql cross-join natural-join


【解决方案1】:

NATURAL join 是标准 SQL 的一个奇怪之处,它很少有用且非常棘手。我根本不会使用它。

连接条件中的USING 子句几乎一样短且不易出错(以防基础表中的列发生更改或您编辑查询的FROM 列表)。一些 SQL 专业人士甚至不鼓励使用 USING 子句,因为它比更明确的 ON 子句更容易中断。我不和他们在一起。

在您的特定查询中,派生表 q0q1 具有重复的列名,这使得使用 NATURAL 连接成为不可能 - 以及 任何 尝试引用 完全模棱两可的列名。这包括外部SELECT 列表中的模糊引用q0.sid, q0.sname(表studentq0 中包含两次)。此外,子查询q1 中的SELECT 列表没有任何作用,这些列在任何地方都没有使用。

您的查询在多个地方被破坏,您已重写它。您的问题应该首先描述查询应该实现的目标、确切的表定义和 Postgres 版本。

【讨论】:

    【解决方案2】:

    在教授的帮助下,我找到了答案。您必须使用 With 语句粗暴地重命名每个列名。所以应该是这样的:

    with e1 as (select t1.sid as t1sid, t1.bookno as t1bookno,
                       s1.sid as s1sid, s1.sname as s1sname,
                       s2.sid as s2sid, s2.sname as s2sname
                from buys t1 cross join student s1 cross join student s2),
         e2 as (select t1.sid as t1.sid, etc as etc) 
    

    这只是重命名您需要的每一列的一种残酷方法,但它确实有效。抱歉,我没有在问题中指定我试图做的是直接转换为 SQL 中的关系代数。感谢任何试图提供帮助的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多