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

SQL主键/表连接

SQL主键/表连接,sql,sql-server,join,inner-join,Sql,Sql Server,Join,Inner Join,好的,这是一个相对简单的问题,我只需要确认一下。我很确定我知道答案,但我需要专家的确认,因为我有强迫症 无论如何,我想知道一个简单的内部连接语句之间有什么区别 只需使用where子句将我要匹配的表的主键设置为=即可 我写了这个 select a.CONTACT_ID, a.TRADE_REP as Rep_Trading_ID, p.CRD_NUMBER, c.FIRST_NAME, c.LAST_NAME from dbo.REP_PROFILE p, dbo.REP_ALIAS a, dbo

好的,这是一个相对简单的问题,我只需要确认一下。我很确定我知道答案,但我需要专家的确认,因为我有强迫症

无论如何,我想知道一个简单的内部连接语句之间有什么区别 只需使用where子句将我要匹配的表的主键设置为=即可

我写了这个

select a.CONTACT_ID, a.TRADE_REP as Rep_Trading_ID, p.CRD_NUMBER, c.FIRST_NAME, c.LAST_NAME
from dbo.REP_PROFILE p, dbo.REP_ALIAS a, dbo.CONTACT c
where 
c.CONTACT_ID = p.CONTACT_ID
and p.CONTACT_ID = a.TRADE_REP 
and a.PRIMARY_YN = 'y'
在我看来,这似乎执行了完全相同的查询,就像我在联系人ID上创建了表c和p之间的内部联接以及表p和a之间的另一个内部联接一样(联系人ID是我的主键)


我说得对吗?我部分正确吗?我是不是太无知了?任何验证都可以

是,使用您提供的格式可以很好地进行内部联接

但是当你到达左/右连接时该怎么办呢?那么就不能在where子句中使用这样的连接条件

如果我没弄错的话,老派的语法会像你一样

=* for LEFT JOIN

您可能会觉得下面的文章读得很好(更具体地说是各种连接类型)


是的,使用您提供的格式可以很好地用于内部联接

但是当你到达左/右连接时该怎么办呢?那么就不能在where子句中使用这样的连接条件

如果我没弄错的话,老派的语法会像你一样

=* for LEFT JOIN

您可能会觉得下面的文章读得很好(更具体地说是各种连接类型)

是一样的

请看这两张表:

CREATE TABLE table1 (
  id INT,
  name VARCHAR(20)
);

CREATE TABLE table2 (
  id INT,
  name VARCHAR(20)
);
使用内部联接的查询的执行计划:

-- with inner join

EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
以及使用WHERE子句的查询的执行计划

-- with where clause

EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
在我看来,使用JOIN更具可读性。

也一样

请看这两张表:

CREATE TABLE table1 (
  id INT,
  name VARCHAR(20)
);

CREATE TABLE table2 (
  id INT,
  name VARCHAR(20)
);
使用内部联接的查询的执行计划:

-- with inner join

EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
以及使用WHERE子句的查询的执行计划

-- with where clause

EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2

在我看来,使用JOIN更具可读性。

执行
JOIN
语法更易于阅读(任何东西在哪里都很明显,诸如此类)。由于将
JOIN
更改为
OUTER JOIN
非常容易,而且更容易操作,因此它也被认为更灵活


有关更多详细信息,请参阅本文(它是MySQL,但同样的问题也会出现/应用):

执行
JOIN
语法更容易阅读(无论它在哪里以及诸如此类的事情都很明显)。由于将
JOIN
更改为
OUTER JOIN
非常容易,而且更容易操作,因此它也被认为更灵活


有关更多详细信息,请参阅本文(这是MySQL,但同样的问题也会出现/应用):

可能重复的可能重复的可能重复的感谢您的回复!我也喜欢学习一些被遗忘的语法。当使用其他连接时,我喜欢使用Visual SQL连接的打印输出,可以在这里找到,谢谢您的回复!我也喜欢学习一些被遗忘的语法。当使用其他联接时,我喜欢使用Visual SQL联接的打印输出,可以在这里找到,我同意可读性,我更喜欢使用联接语句,因为它在政治上似乎更正确。我只是想知道正在执行的基本操作是否相同,先生,您已经向我展示了我想要的,谢谢@阿达姆:是的。我在答案中加入了
EXPLAIN
,这是错误的,因为它是针对MySQL的。但您总是对SQL Server中如何执行查询有疑问,应该在SQL Server Management Studio中使用“显示估计的执行计划”。这样,您就可以看到它是否缺少索引,或者它是否是一个错误的查询。是优化查询的最佳方法。然而,答案仍然是一样的,
JOIN
(而不是
LEFT JOIN
或任何其他变体)和
,其中
的工作方式相同。我同意可读性,我更喜欢使用JOIN语句,因为它似乎在政治上更正确。我只是想知道正在执行的基本操作是否相同,先生,您已经向我展示了我想要的,谢谢@阿达姆:是的。我在答案中加入了
EXPLAIN
,这是错误的,因为它是针对MySQL的。但您总是对SQL Server中如何执行查询有疑问,应该在SQL Server Management Studio中使用“显示估计的执行计划”。这样,您就可以看到它是否缺少索引,或者它是否是一个错误的查询。是优化查询的最佳方法。但是,答案仍然是一样的,
JOIN
(而不是
LEFT JOIN
或任何其他变体)和
,其中
的工作方式相同。