加入三个表澄清

时间:2017-01-16 20:26:15

标签: sql oracle join

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

说我有3张桌子:

var form_data = new FormData($('form')[0]);
$.ajax({
    type: 'POST',
    url: 'ajax/ajax-reg.php',
    data: form_data,
    processData: false,
    contentType: false,
    success: function() {
        // handle response here...
    }
});

这些表都有一个共同的列。如果我要将这些表连接在一起以获得每个表中具有匹配帐号的列,我会进行内部联接以仅返回匹配的记录。

在查询中,我会有类似的东西:

TableA : 
Account_Number | Name | Address

TableB : 
Account_Number | Occupation | Salary

TableC :
Account_Number | Model | Make

3 个答案:

答案 0 :(得分:0)

   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 T1.AccountNumber=1234123412341234 

内部联接将仅返回您要加入的表中存在的记录。因此,在您选择使用TableA时,在where子句中应使用T1.AccountNumber

有关详细信息,请查看此链接http://www.sql-join.com/

答案 1 :(得分:0)

有关您的数据模型需要考虑的一些事项。例如

o这些表之间有什么关系?有吗?事实上,Account_Number列只是一个巧合 o假设存在关系,基数是什么?例如,对于表A中的任何给定行,表B中有多少对应的行; 0,1或多个。同样从表B到表A;表B和表C之间类似。 O操作。根据这些关系的含义,您可能会发现自己处于一种称为“粉丝陷阱”的情境中。在这种情况下,你可以摆脱关系:

      B
     / \
    /   \
   A     C

使用示例更容易描述。

让我们说:

A是销售代表的表格 B是分支表 C是一个账户表

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

这是一个完全有效的数据模型

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

所以我知道这是对你的问题的一个很长的答案,但它详细阐述了简短的答案,这是"它取决于" :)

答案 2 :(得分:0)

BobC对于语义是正确的,它取决于。

从语法上讲,你的例子是完全正确的,我也是如何做到的。加入仅适用于2个对象/结果集,并且两者都必须处于不希望交叉连接的情况下。此外,您在第二个联接中使用的第一个联接中的哪个相同帐号#列并不重要。

对于WHERE条件,如果只有一个表获得了Index或Partionkey,请使用该表。否则,使用WHERE语句为您提供最少行的表。

从最小的表/结果集开始,加入通常会带来好处。尽管Oracle仍会根据收集的统计信息优化您的声明。