Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接三个表_Sql_Oracle_Join - Fatal编程技术网

Sql 连接三个表

Sql 连接三个表,sql,oracle,join,Sql,Oracle,Join,这不是一个我需要直接回答的问题,我只需要知道,从哲学的角度来看,我需要加入多少个表 假设我有3张桌子: TableA : Account_Number | Name | Address TableB : Account_Number | Occupation | Salary TableC : Account_Number | Model | Make 这些表都有一个共同的列。如果我要将这些表连接在一起,以便对每个表中具有匹配帐号的列进行排序,我将执行内部连接,以仅返回匹配的记录 在查

这不是一个我需要直接回答的问题,我只需要知道,从哲学的角度来看,我需要加入多少个表

假设我有3张桌子:

TableA : 
Account_Number | Name | Address

TableB : 
Account_Number | Occupation | Salary

TableC :
Account_Number | Model | Make
这些表都有一个共同的列。如果我要将这些表连接在一起,以便对每个表中具有匹配帐号的列进行排序,我将执行内部连接,以仅返回匹配的记录

在查询中,我会有如下内容:

SELECT T1.Name, T1.Address, T2.Occupation, T2.Salary, T3.Model, T3.Make
FROM TableA T1
INNER JOIN TableB T2 ON T1.Account_Number=T2.Account_Number
INNER JOIN TableC T3 ON T2.Account_Number=T3.Account_Number /Do I need to join T3 to T1 or is this handled by having T1 and T2 joined together?
WHERE ??.AccountNumber=1234123412341234 /Would any Table work in the WHERE clause here since we are all looking for the same account_number in each table?
内部联接将只返回您要联接的表中存在的记录,。所以在select OUR use表中,在where子句中,应该使用T1.AccountNumber


有关更多信息,请看这个链接

关于数据模型有一些事情要考虑。比如说

o这些表之间的关系是什么?有吗?有一个账号栏只是巧合吗 o假设存在关系,基数是多少?例如,对于表A中的任何给定行,表B中有多少对应行;0、1或多个。类似地,从表B到表A;表B和表C之间也是如此。 o。根据这些关系的含义,你可能会发现自己处于一种被称为“粉丝陷阱”的境地。在这种情况下,您的关系呈扇形散开:

      B
     / \
    /   \
   A     C
用一个例子更容易描述

让我们说:

A是一张销售代表表 B是一个分支表 C是一个科目表

因此,每个销售代表在一个分支机构工作(基数=1),每个分支机构有一个或多个销售代表(基数=多个) 每个分行处理多个账户,每个账户在一个分行持有

这是一个非常有效的数据模型

但是,从这个数据模型中,如果您想知道哪个销售代表处理哪个帐户,您不能。这就是所谓的风扇陷阱。在这个特定的例子中,您可能会通过在销售代表和客户之间建立直接关系来解决这个问题;即使它看起来是多余的


所以我知道这是对你问题的一个长答案,但它详细阐述了简短的答案,即“视情况而定”:)

BobC在语义方面是正确的,视情况而定

从语法上讲,你的例子是完全正确的,我也会这么做。连接仅适用于两个对象/结果集,并且两个对象/结果集都必须处于不需要交叉连接的条件下。此外,在第二个联接中使用第一个联接中相同的account#列并不重要

至于WHERE条件,如果只有一个表获得了索引或Partionkey,则使用该索引或Partionkey。否则,使用WHERE语句提供最少行的表

从最小的表/结果集开始连接通常会带来好处。尽管Oracle将优化您关于收集的统计数据的陈述

      B
     / \
    /   \
   A     C