当前位置: 首页 > 面试题库 >

SQL连接,``这里是表的条目,但不能被引用''。

酆光熙
2023-03-14
问题内容

我有一个失败的SQL查询,给我错误:

“有一个表条目,但是不能从查询的这一部分中引用它”

通过查询,我需要全部3个表,但只有行程和船只具有匹配的ID才能加入。测试是一个shapefile,我需要对它执行postGIS功能,但它与其他两个ID没有相似的列ID。

 select trips.*
 from trips, test
 inner join boats on boats.id = trips.boat_id
 where st_intersects(trips.geom, test.geom) and
 boats.uid = 44

我认为这与join语句有关,但我不太了解。我会对这里发生的事情的解释非常感兴趣。


问题答案:

简单规则: 请勿FROM子句中使用逗号。 始终 使用显式JOIN语法。。。即使那意味着写出来CROSS JOIN

如评论中所述,编写查询的正确方法是:

 select trips.*
 from trips inner join
      test
      on st_intersects(trips.geom, test.geom) inner join
      boats
      on boats.id = trips.boat_id
 where boats.uid = 44;

但是,问题是为什么这不起作用:

from trips,
     test inner join
     boats
     on boats.id = trips.boat_id

首先,我想指出的是,在MySQL文档中比在Postgres文档中更好地描述了这种语法的失败:

但是,逗号运算符的优先级小于INNER JOIN,CROSS JOIN,LEFT
JOIN等。如果在存在联接条件时将逗号联接与其他联接类型混合使用,则可能会出现“ on子句”中形式为“未知列”
col_name”的错误。本节稍后将提供有关解决此问题的信息。

我认为描述此问题的一种更简单的方法是,JOIN操作符对作为其参数的表/表达式进行操作。逗号分隔参数。因此,第一个表根本无法识别,因为逗号会“阻止”它。

我认为您可以使用括号解决此问题:

from (trips, test inner) join
     boats
     on boats.id = trips.boat_id

您绝对可以使用CROSS JOIN以下方法解决它:

from trips cross join
     test inner join
     boats
     on boats.id = trips.boat_id

但是为什么要打扰呢?有一种编写查询的正确方法。



 类似资料:
  • 问题内容: 我想从表T1中选择所有记录,其中表A和B中的值与表T2中的列C和D没有匹配的元组。 在mysql的“ here not notin”中,我可以使用两列来阅读如何使用T1中的select A,B来完成该操作,其中(A,B)不在(T2中的SELECT C,D)中,但是在T中失败-SQL对我来说导致“’,’附近的语法不正确”。 那么我该怎么做呢? 问题答案: 使用相关的子查询: 确保在Sec

  • 我正在使用Ingres 11.0 DB,不确定它是否在其他数据库引擎上具有相同的行为,但这里是它 它不会返回表1中的所有记录,但我使用的是左连接,它应该从T1返回aa记录,从t2只处理行,只返回1条记录 如果我将其中一个条件从where子句移动到join条件,它的开始将返回我所期望的结果 问题是为什么它不工作在哪里所有搜索条件在哪里子句,但工作时,我移动t2.id_number从哪里加入条件? 我

  • 问题内容: 我必须根据可以为空的值选择相应的列以进行联接。详细地: 如果shoporders.InvoiceAddressId为null,那么我必须使用shoporders.DeliveryAddressId 有什么线索吗? 提前致谢 问题答案:

  • 问题内容: 我有一张表格,其中每一行都是以下形式: 凡我查询寻找的价值配对,使用。就查询时间而言,改为使用一个表(其中每行是一个排列)是否更有效: 这样,我这次使用=运算符查询了值b。 值得注意的是,我感兴趣的用例当前有大约10,000行,其中每个“列表”元素平均有8个条目。我同时标记了两者,因为使用和的数据库都存在类似的问题。 问题答案: 我的查询在其中使用LIKE寻找一对值,%b%。就查询时间

  • 我想使用Kafka发布MSSQL CDC事件。 我将Docker容器用于: null 所有容器开始成功运行。 然后我在SQL Server容器中创建了新的MSSQL数据库。在新数据库中创建了1个表,并为该表打开了CDC。疾控中心运作良好。 然后我将下面的连接器配置发送到Kafka Connect REST API,如下所示: com.microsoft.sqlserver.jdbc.sqlserv

  • 因此,我在cmd中连接到Oracle 11g,如下所示 但是,当我在Oracle SQL Developer中键入相同的用户名和密码时,它不起作用。我有uname和pwd,在连接名中放什么? 这就是我得到的,当我输入一个连接名称和我的uname和PWD OracleSQLDeveloper