此 SQL 运行外连接和括号是否有充分理由?

问题描述 投票:0回答:2

我发现下面的 from 子句令人困惑。这是数据库工程师都应该理解的 from 子句设置吗?让我困惑的功能是:

  1. 所有左外连接。几乎所有的连接作为内部连接都是有效的 加入。为什么左外连接受到青睐?
  2. 左外连接似乎是括号嵌套的一部分。我 不明白为什么这是可取的或有利的。我明白了 通过删除括号可以理解的结果是 有问题吗?
  3. 为什么全是“引号?

我更改了表和字段名称以保护我雇主的隐私。

SELECT KITTEN_BOWL.ID
  FROM (((((((("PUBLIC"."KITTEN_BOWL"          "KITTEN_BOWL"
               LEFT OUTER JOIN
               "PUBLIC"."ZC_KITTEN_CLAW_TYPE"  "ZC_KITTEN_CLAW_TYPE"
               ON "KITTEN_BOWL"."KITTEN_CLAW_TYPE_C" =
                  "ZC_KITTEN_CLAW_TYPE"."KITTEN_CLAW_TYPE_C")
              LEFT OUTER JOIN
              "PUBLIC"."KNOWLEDGE_FREEDOM"     "KNOWLEDGE_FREEDOM_coll"
              ON "KITTEN_BOWL"."KITTEN_COLL_FREEDOMT_PUBLIC_CODE" =
                 "KNOWLEDGE_FREEDOM_coll"."PRPUBLIC_CODEE_PUBLIC_CODE")
             LEFT OUTER JOIN
             "PUBLIC"."KNOWLEDGE_EMP"          "KNOWLEDGE_EMP"
             ON "KITTEN_BOWL"."KITTEN_COLL_BY_PUBLIC_CODE" =
                "KNOWLEDGE_EMP"."USER_PUBLIC_CODE")
            LEFT OUTER JOIN
            "PUBLIC"."KITTEN_DECISION_REL"     "KITTEN_DECISION_REL"
            ON "KITTEN_BOWL"."KITTENIMEN_PUBLIC_CODE" =
               "KITTEN_DECISION_REL"."KITTENIMEN_PUBLIC_CODE")
           LEFT OUTER JOIN
           "KNOWLEDGE"."SELF"                  "SELF"
           ON "KITTEN_BOWL"."KITTEN_EPT_FRIEND_PUBLIC_CODE" = "SELF"."FRIEND_PUBLIC_CODE")
          LEFT OUTER JOIN
          "PUBLIC"."KNOWLEDGE_FREEDOM"         "KNOWLEDGE_FREEDOM_acc_from"
          ON "KITTEN_DECISION_REL"."ACC_FROM_FREEDOM_PUBLIC_CODE" =
             "KNOWLEDGE_FREEDOM_acc_from"."PRPUBLIC_CODEE_PUBLIC_CODE")
         LEFT OUTER JOIN
         "KNOWLEDGE"."DECISION_MSTR_BOWL"      "DECISION_MSTR_BOWL"
         ON "KITTEN_DECISION_REL"."KITTEN_TST_PUBLIC_CODE" =
            "DECISION_MSTR_BOWL"."DECISION_PUBLIC_CODE")
        LEFT OUTER JOIN
        "KNOWLEDGE"."HOMEWORK_ADVANCEMENT_2"   "HOMEWORK_ADVANCEMENT_2"
        ON "KITTEN_DECISION_REL"."KITTEN_TST_HOMEWORK_PUBLIC_CODE" =
           "HOMEWORK_ADVANCEMENT_2"."HOMEWORK_ADVANCEMENT_PUBLIC_CODE")
       LEFT OUTER JOIN "KNOWLEDGE"."KNOWLEDGE_FREEDOM" "KNOWLEDGE_FREEDOM_ord"
          ON "HOMEWORK_ADVANCEMENT_2"."FRIEND_LOC_PUBLIC_CODE" =
             "KNOWLEDGE_FREEDOM_ord"."PRPUBLIC_CODEE_PUBLIC_CODE"
sql oracle
2个回答
0
投票
  1. 并不是说外连接受到青睐;它们的存在是有原因的,因此即使它们之间没有匹配项,查询也会返回行。我认为您应该了解数据以了解是否应该(或不)使用外连接。作者大概知道吧。

  2. 嵌套括号:据我所知,它们在这里没有用。

  3. 引号:在大多数地方也是无用的。在Oracle中,我们通常不使用它们。名称 - 在数据字典中 - 以大写形式存储,无论您如何创建表、过程、列......您可以使用您想要的任何字母大小写并以任何您想要的方式引用它们除非您将它们括在双引号中 - 在在这种情况下,您必须使用双引号并完全匹配名称,就像您在创建这些对象时使用它们一样。

    说明它的示例 - 在您发布的代码中 - 是

    "KNOWLEDGE_FREEDOM_coll"
    ,其中除了名称的最后部分之外,所有内容都是大写的(除非是您,谁 masked 名字)。


0
投票

如果这确实是代码,仅选择一个 ID 列,并且没有Where 子句或任何左连接表中的任何其他内容,则可以使用以下方法实现相同的结果:

Select ID From KITTEN_BOWL;

是这样的:

WITH
    from_tbl AS
        ( Select 1 "ID", 110 "A_NUMBER", 'A' "A_LETTER" From Dual Union All
          Select 2 "ID", 120 "A_NUMBER", 'B' "A_LETTER" From Dual Union All
          Select 3 "ID", 130 "A_NUMBER", 'C' "A_LETTER" From Dual 
        ), 
    left_tbl AS 
        ( Select 101 "ID", 9 "FROM_TBL_ID", 'X' "LEFT_LETTER" From Dual Union All
          Select 102 "ID", 1 "FROM_TBL_ID", 'Y' "LEFT_LETTER" From Dual Union All
          Select 103 "ID", 7 "FROM_TBL_ID", 'Z' "LEFT_LETTER" From Dual 
        )
Select    ft.ID
From      from_tbl ft
Left Join left_tbl lt ON(lt.FROM_TBL_ID = ft.ID)
--  R e s u l t 
    ID
------
     1
     2
     3

相同的结果为您提供以下代码

Select ID From from_tbl

关于左连接:

  • 当 From 表中的行在左连接表中没有匹配行,但您仍想获取 From 表行时使用它
Select    ft.ID, ft.A_NUMBER, ft.A_LETTER, lt.LEFT_LETTER
From      from_tbl ft
Left Join left_tbl lt ON(lt.FROM_TBL_ID = ft.ID)
/*  R e s u l t :
        ID   A_NUMBER A_LETTER LEFT_LETTER
---------- ---------- -------- -----------
         1        110 A        Y
         2        120 B                    
         3        130 C                    */

如果您使用 Inner Join 而不是 Lefft Join,那么它将充当过滤器,仅选择匹配的行:

Select     ft.ID, ft.A_NUMBER, ft.A_LETTER, lt.LEFT_LETTER
From       from_tbl ft
Inner Join left_tbl lt ON(lt.FROM_TBL_ID = ft.ID)
/*  R e s u l t :
        ID   A_NUMBER A_LETTER LEFT_LETTER
---------- ---------- -------- -----------
         1        110 A        Y           */
  • 您可以使用 Left Join 来仅选择不匹配的行(Where 子句)
Select    ft.ID, ft.A_NUMBER, ft.A_LETTER, lt.LEFT_LETTER
From      from_tbl ft
Left Join left_tbl lt ON(lt.FROM_TBL_ID = ft.ID)
Where     lt.ID Is Null
/*  R e s u l t :
        ID   A_NUMBER A_LETTER LEFT_LETTER
---------- ---------- -------- -----------
         2        120 B                    
         3        130 C                    */
© www.soinside.com 2019 - 2024. All rights reserved.