Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 - Fatal编程技术网

Sql 需要帮助在三个表之间连接键吗

Sql 需要帮助在三个表之间连接键吗,sql,Sql,好的,我在这个查询中遇到困难,我要做的是将titles.pub_id加入publisher.pub_id,然后将publisher.pub_id加入employee.pub_id 这就是我到目前为止的想法 在标题表中 title\u id是主键 pub_id是外键 SELECT titles.title_id FROM titles INNER JOIN titleauthor on titleauthor.title_id = titles.title_id --INNER JOIN empl

好的,我在这个查询中遇到困难,我要做的是将titles.pub_id加入publisher.pub_id,然后将publisher.pub_id加入employee.pub_id

这就是我到目前为止的想法

在标题表中
title\u id
是主键
pub_id
是外键

SELECT titles.title_id
FROM titles
INNER JOIN titleauthor on titleauthor.title_id = titles.title_id
--INNER JOIN employee on employee.pub_id = publishers.pub_id
--INNER JOIN publishers on publishers.pub_id = titles.pub_id
在发布者表中
pub_id
是主键
pub_name
是一个日期键

在employee表中,
pub_id
是一个外键

SELECT titles.title_id
FROM titles
INNER JOIN titleauthor on titleauthor.title_id = titles.title_id
--INNER JOIN employee on employee.pub_id = publishers.pub_id
--INNER JOIN publishers on publishers.pub_id = titles.pub_id
我从这个查询中得到的错误是

Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "publishers.pub_id" could not be bound.

注意:在我看来,您需要从这个查询中获得的信息可以通过使用左连接而不是内部连接来实现(查询速度更快,占用内存更少)

连接是左关联的,因此
ON
子句只能引用查询中较早连接的表,而不能引用以后连接的表。因此,您需要更改这两行的顺序:

INNER JOIN employee on employee.pub_id = publishers.pub_id
INNER JOIN publishers on publishers.pub_id = titles.pub_id
鉴于此:

INNER JOIN publishers on publishers.pub_id = titles.pub_id
INNER JOIN employee on employee.pub_id = publishers.pub_id

为了使employee.pub_id=publisher.pub_id上的
在加入之前不参考
publisher

什么阻止了你?您收到了什么错误消息?您是否得到任何意外的输出?
标题作者
表如何?Msg 4104,16级,状态1,第1行多部分标识符“publisher.pub_id”无法绑定。您能否引用任何可靠的来源来支持您的说法,即
左连接
更快,占用更少内存?(请记住,这个问题也不是RDBMS特有的)
左连接
应该根据需要使用。事实上,我看不出
左连接
如何比
内部连接
消耗更少的内存,由于前者的结果集至少包含与后者相同的行和列。我没有说左连接通常更快/消耗更少的内存,我是说它似乎适用于Steffan的查询(特定于大小写)。在许多方面,内部联接的本质可以提供更快的结果;s优化。但也有一些情况下,外部连接(左/右连接)更有利/更可取,Steffan的情况似乎是后者之一。这并不是关于哪一个更好,而是取决于具体情况。Steffan刚刚给出了他的问题的简化版本,以明确他的问题,但似乎(我猜),他试图用相应的详细信息显示出版物列表。在这种情况下,所需的循环是从最左边的表解析到最右边的表,不需要记录排除,因此左连接非常适合这种查询。如果筛选基于表中的不同字段,则内部联接将执行得更好,因为在已压缩的记录集中将执行大量条件检查。@Jack:我所说的“内存更少”不是指客户端的内存(用于保存提取的行),而是指服务器中用于处理查询的内存。在一般的SQL引擎实现中,当作为记录排除过程的一部分评估多个表中的数据时,内部联接将创建一个新的临时数组(索引索引索引)。另一方面,左联接只是在索引上迭代记录(假定联接键在两个表中都被索引)。“联接是左关联的”——从解析的角度来看,这只适用于
ON
语法。如果您简化使用
NATURAL[internal]JOIN
,那么在解析方面,这些连接将是关联的。@onedaywhen:哦,不,在某些情况下,它也会影响实际的连接语义。例如,
t1-LEFT-JOIN-t2-ON-1-INNER-JOIN-t3-ON-2-2
意味着
(t1-LEFT-JOIN-t2-ON-1-1)INNER-JOIN-t3-ON-2-2
意味着
(t1-LEFT-JOIN-t2-ON-1-1)INNER-JOIN-t3-ON-ON-2
,而不是
t1-LEFT-JOIN(t2-INNER-JOIN-t3-ON-ON-ON-2-ON-2-2-2-2-;同意外部联接不是关联的。就关系运算符而言,内部联接是关联的;可以将其视为SQL Server**的一个“功能”,即如果您在
FROM
子句中更改内部联接的顺序,则可能必须更改
ON
子句。**我这样说是因为OP的未注释查询是有效的标准SQL,根据@onedaywhen:Understanding。我之所以写“连接是左关联的”,而不是“内部连接是左关联的”或“您的连接是左关联的”或诸如此类的东西,是因为我想把它作为关于连接的一般性陈述。但我明白了这是怎么回事。(开玩笑地说)哦,你是说一条只适用于SQL Server的一般规则,并且只适用于某些联接类型,并且只适用于某些情况(例如,当右侧的联接不包含在括号中时)?说真的,我想我们已经把事情弄清楚了,谢谢:)