Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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_Self Join - Fatal编程技术网

Sql 自联接与内联接

Sql 自联接与内联接,sql,oracle,self-join,Sql,Oracle,Self Join,自联接和内部联接的区别是内部联接(有时称为简单联接)是两个或多个表的联接,只返回满足联接条件的行 自联接是表与自身的联接。此表在FROM子句中出现两次,后面是表别名,用于限定联接条件中的列名。要执行自联接,Oracle数据库将合并并返回满足联接条件的表行。自联接将表联接到自身。employee表可能会连接到自身,以便在同一行中显示经理姓名和员工姓名 内部联接联接任何两个表并返回两个表中都存在键的行。自联接可以是内部联接(大多数联接是内部联接,大多数自联接是内部联接)。内部联接可以是自联接,但大多

自联接和内部联接的区别是内部联接(有时称为简单联接)是两个或多个表的联接,只返回满足联接条件的行


自联接是表与自身的联接。此表在FROM子句中出现两次,后面是表别名,用于限定联接条件中的列名。要执行自联接,Oracle数据库将合并并返回满足联接条件的表行。

自联接将表联接到自身。
employee
表可能会连接到自身,以便在同一行中显示经理姓名和员工姓名


内部联接联接任何两个表并返回两个表中都存在键的行。自联接可以是内部联接(大多数联接是内部联接,大多数自联接是内部联接)。内部联接可以是自联接,但大多数内部联接都涉及联接两个不同的表(通常是父表和子表)。

我发现将SELECT语句中的所有表都视为表示它们自己的数据集是很有帮助的

在应用任何条件之前,可以认为每个数据集都是完整的(例如,整个表)

联接只是开始细化这些数据集以找到真正需要的信息的几种方法之一

虽然在设计数据库模式时可能会考虑某些关系(主键外键),但这些关系实际上只存在于特定查询的上下文中。查询编写器可以将他们想要的内容与他们想要的内容关联起来。稍后我会举一个例子


内部联接使两个表相互关联。在一个查询中通常有多个联接操作来将多个表链接在一起。它可以变得非常复杂。对于一个简单的例子,考虑下面的三个表…

STUDENT

| STUDENTID | LASTNAME | FIRSTNAME |
------------------------------------
      1     |  Smith   |   John
      2     |  Patel   |  Sanjay
      3     |   Lee    |  Kevin
      4     |  Jackson |  Steven


学生表和班级表通过注册表相互关联。这种表称为连接表

要编写查询以显示所有学生及其注册的班级,可以使用两个内部联接

SELECT stud.LASTNAME, stud.FIRSTNAME, class.COURSE, class.PROFESSOR
FROM STUDENT stud
INNER JOIN ENROLLMENT enr
    ON stud.STUDENTID = enr.STUDENTID
INNER JOIN CLASS class
    ON class.CLASSID = enr.CLASSID;
仔细阅读上面的内容,你就会看到发生了什么。您将得到以下数据集作为回报

 | LASTNAME | FIRSTNAME | COURSE | PROFESSOR |
 ---------------------------------------------
     Patel  |   Sanjay  | CS 301 |  McDavid
      Lee   |   Kevin   | CS 101 |   Smith
    Jackson |  Steven   | CS 201 |  Ghandi
通过使用JOIN子句,我们将所有三个表的数据集都限制为相互匹配的数据集。使用
ON
子句定义“匹配项”。请注意,如果运行此查询,您将看不到类表中的CLASSID 4行或学生表中的STUDENTID 1行,因为这些ID在匹配项中不存在(在本例中为注册表)。查看“左”/“右”/“全外”联接,了解如何使其工作方式稍有不同

请注意,根据我之前对“关系”的评论,没有理由无法在LASTNAME和PROFESSOR列上直接运行与学生表和班级表相关的查询。这两列在数据类型上是匹配的,看看这个!他们甚至有共同的价值!作为回报,这可能是一个奇怪的数据集。我的观点是,这是可以做到的,而且你永远不知道你将来可能需要什么来在你的数据中建立有趣的连接。了解数据库的设计,但不要将“关系”视为不可忽略的规则

同时。。。自动加入


考虑下表

PERSON

| PERSONID | FAMILYID |  NAME  |
--------------------------------
      1    |     1    |  John
      2    |     1    | Brynn
      3    |     2    | Arpan
      4    |     2    | Steve
      5    |     2    |  Tim
      6    |     3    | Becca
如果你想建立一个数据库,记录你认识的所有人以及哪些人属于同一个家庭,这可能就是它的样子

如果你想返回一个人,例如Personid4,你会写

SELECT * FROM PERSON WHERE PERSONID = 4;
SELECT * FROM PERSON WHERE FAMILYID = 2;
你会知道他和FAMILYID 2是一家人。然后,为了找到他家里所有的人,你可以写

SELECT * FROM PERSON WHERE PERSONID = 4;
SELECT * FROM PERSON WHERE FAMILYID = 2;
做了,做了!当然,SQL可以在一个查询中实现这一点,您猜到了,它使用自连接

真正触发自联接需求的是表中包含一个唯一的列(PERSONID)和一个充当某种“类别”(FAMILYID)的列。此概念称为基数,在本例中表示一对多或1:M的关系。每个人只有一个,但家庭中有许多

因此,我们想要返回的是一个家庭的所有成员,如果家庭的一个成员的人名已知

SELECT fam.*
FROM PERSON per
JOIN PERSON fam
    ON per.FamilyID = fam.FamilyID
WHERE per.PERSONID = 4;
这是你能得到的

| PERSONID | FAMILYID |  NAME  |
--------------------------------
      3    |     2    | Arpan
      4    |     2    | Steve
      5    |     2    |  Tim
让我们注意几件事。“SELF JOIN”这个词在任何地方都不会出现。这是因为自连接只是一个概念。上面查询中的单词JOIN可能是一个左JOIN,并且会发生不同的事情。自联接的要点是您使用同一个表两次

以我以前在数据集上的soapbox为例。在这里,我们从PERSON表中的数据集开始了两次。数据集的实例都不会影响另一个,除非我们说它会影响另一个

让我们从查询的底部开始。per
数据集仅限于PERSONID=4的行。知道我们知道的表将只返回一行。该行中的FAMILYID列的值为2

在ON子句中,我们将fam数据集(此时仍然是整个PERSON表)限制为FAMILYID值与每个数据集的的一个或多个FAMILYID匹配的行。正如我们所讨论的,我们知道per数据集只有一行,因此只有一个FAMILYID值