【问题标题】:SELECT * FROM tableA, tableB WHERE Conditions [+]SELECT * FROM tableA, tableB WHERE 条件 [+]
【发布时间】:2012-08-14 01:58:02
【问题描述】:

我有以下问题

SELECT * 
FROM tableA, tableB
WHERE Conditions [+]

这个关键字条件[+] 代表什么? 此查询如何作为外连接?

【问题讨论】:

  • 您发布的查询似乎没有意义。鉴于您提到“外部连接”,您的意思可能是WHERE tableA.col1 = tableB.col1(+)
  • 我使用标准 SQL 处理 MS-SQL。我从未见过这样的语法。它只是外部连接的示例。我想知道如何用标准sql编写。

标签: sql oracle outer-join full-outer-join


【解决方案1】:

这是旧的 Oracle Join 语法。

SELECT * 
FROM tableA, tableB
WHERE Conditions [+] -- this should be tableA (+) = tableB

+ 符号的位置表示JOIN 语法。

如果您查询的是:

SELECT * 
FROM tableA, tableB
WHERE tableA.id (+) = tableB.Id

然后它会显示一个RIGHT OUTER JOIN,所以相当于:

SELECT * 
FROM tableA
RIGHT OUTER JOIN tableB
   ON tableB.id = tableA.Id

如果+ 符号在另一边,那么它将是LEFT OUTER JOIN

SELECT * 
FROM tableA, tableB
WHERE tableA.id  = tableB.Id (+)

等价于

SELECT * 
FROM tableA
LEFT OUTER JOIN tableB
   ON tableA.id = tableB.Id

不过,我建议使用标准连接语法。

如果您没有指定+ 符号,那么它将被解释为INNER JOIN

SELECT * 
FROM tableA, tableB
WHERE tableA = tableB

相当于:

SELECT * 
FROM tableA
INNER JOIN tableB
    ON tableA.id = tableB.id

FULL OUTER JOIN 将使用两个SELECT 语句和一个UNION 编写:

SELECT * 
FROM tableA, tableB
WHERE tableA.id  = tableB.Id (+)
UNION
SELECT * 
FROM tableA, tableB
WHERE tableA.id (+) = tableB.Id 

相当于是:

SELECT * 
FROM tableA
FULL OUTER JOIN tableB
    ON tableA.id = tableB.id

这是一个解释了很多这些的教程:

Old Outer Join Syntax

【讨论】:

  • @blueefeet 我们如何使用我提到的 oracle 旧语法编写完整的外连接?
  • 非常感谢亲爱的。现在我完全明白了。
【解决方案2】:

我讨厌只是复制和粘贴答案,但如果你稍微搜索一下,这种事情可能是found pretty easily...

外连接返回一个表的行,即使没有 在另一个匹配行。您通过以下方式在 Oracle 中指定外部联接 在列名后面的括号中放置一个加号 (+) WHERE 子句中的可选表。例如:

SELECT ut.table_name, uc.constraint_name 
FROM user_tables ut, user_constraints uc 
WHERE ut.table_name = uc.table_name(+);

uc.table_name 后面的 (+) 使 user_constraint 表是可选的。 查询返回所有表,没有对应的地方 约束记录,Oracle 在约束名称中提供空值 列。

【讨论】:

  • 我试过但找不到任何这样的关键字 [+]。感谢您的支持。
【解决方案3】:

它的行为方式并不重要。您应该使用外部连接的标准语法:

select *
from tableA left outer join
     tableB
     on . . .

“(+)”语法是Oracle在标准语法之前引入的,已经非常过时了。

【讨论】:

    【解决方案4】:

    此处的“条件”仅表示您用于过滤所有这些数据的内容。

    这里有一个例子:

    SELECT * 
    FROM tableA, tableB
    WHERE Name like '%Bob%'
    

    将返回包含“Bob”的名称。

    关于外连接,实际上你会在 FROM 子句中使用它:

    也许

    SELECT * 
    FROM tableA ta 
         OUTER JOIN tableB tb
         ON ta.name = tb.name
    WHERE ta.age <> 10
    

    顺便说一句,这里是可选的

    【讨论】:

    • 感谢您的信息。但我想知道它会如何表现得像左外连接、右外连接或全外连接?或
    猜你喜欢
    • 1970-01-01
    • 2019-10-03
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多