我发现下面的 from 子句令人困惑。这是数据库工程师都应该理解的 from 子句设置吗?让我困惑的功能是:
我更改了表和字段名称以保护我雇主的隐私。
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"
并不是说外连接受到青睐;它们的存在是有原因的,因此即使它们之间没有匹配项,查询也会返回行。我认为您应该了解数据以了解是否应该(或不)使用外连接。作者大概知道吧。
嵌套括号:据我所知,它们在这里没有用。
引号:在大多数地方也是无用的。在Oracle中,我们通常不使用它们。名称 - 在数据字典中 - 以大写形式存储,无论您如何创建表、过程、列......您可以使用您想要的任何字母大小写并以任何您想要的方式引用它们除非您将它们括在双引号中 - 在在这种情况下,您必须使用双引号并完全匹配名称,就像您在创建这些对象时使用它们一样。
说明它的示例 - 在您发布的代码中 - 是
"KNOWLEDGE_FREEDOM_coll"
,其中除了名称的最后部分之外,所有内容都是大写的(除非是您,谁 masked 名字)。
如果这确实是代码,仅选择一个 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
关于左连接:
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 */
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 */