逗号分隔连接(交叉连接)

Wil*_*son 3 oracle join syntax

我不明白这个查询是如何工作的:

1    SELECT       
2        EXTRACTVALUE(definition_xml.COLUMN_VALUE, 'SubtypeFieldInfo/DomainName') AS domain_name
3    FROM        
4        SDE.GDB_ITEMS_VW i 
5        JOIN SDE.GDB_ITEMTYPES it ON
6            i.Type = it.UUID
7            ,TABLE(XMLSEQUENCE(XMLType(Definition).Extract('/DETableInfo/Subtypes/Subtype/FieldInfos/SubtypeFieldInfo'))) definition_xml  
Run Code Online (Sandbox Code Playgroud)

第 7 行开头的逗号有什么作用?

我的猜测是编写查询的人使用了某种 SQL 简写。也许如果有人可以帮助重新格式化“初学者 SQL”中的查询,它可能会有所帮助。

ype*_*eᵀᴹ 6

逗号是隐式连接运算符,ANSI SQL-89 语法。与以下中的逗号没有区别:

select ... 
from a , b             -- <-- this comma
where a.aid = b.aid; 
Run Code Online (Sandbox Code Playgroud)

我认为你可以用CROSS JOIN*替换它,假设有足够新的 Oracle 版本。

iit并且definition_xml是3个连接表(2个表是基表或视图和第三是像一个派生表,甲骨文称他们为“表集合表达式”),但他们并没有什么不同有关如何将它们加入的别名或参考。

连接和最后一个表周围的括号是完全可选的。我添加它们只是为了显示查询是如何解析的:

SELECT       
    EXTRACTVALUE(definition_xml.COLUMN_VALUE, ...) AS domain_name 
FROM        
      (   SDE.GDB_ITEMS_VW i 
        JOIN 
          SDE.GDB_ITEMTYPES it 
        ON
          i.Type = it.UUID
      )
    ,                           -- or: CROSS JOIN 
      (  TABLE(...) definition_xml
      ) 
;
Run Code Online (Sandbox Code Playgroud)

* CROSS JOIN和逗号连接运算符具有不同的优先级,但这对于特定查询无关紧要。不过,作为一个好习惯,最好不要将逗号连接与显式连接混合在一起JOIN

  • @Wilson456 是的。尽管查询无关紧要,但当您(稍后)添加另一个连接时,您可能会感到惊讶。除非您知道自己在做什么,否则不要将逗号分隔的连接与显式的“JOIN”混合使用。 (2认同)
  • “SELECT 之后的列名”是正交的。`FROM a, b` 等价于 `FROM a CROSS JOIN b`。这就是真正需要的。SELECT 列表可以有 `*` 或 `a.*` 或 `b.*` 或任何列名和表达式,与您编写连接无关。 (2认同)