Dav*_*ave 3 sql t-sql sql-server-2005
我为这两个查询得到不同的结果集,第二个结果集似乎是正确的.这些查询有什么不同.
第二种是什么类型的内连接查询?
1)
FROM TABLE1 t1
INNER JOIN TABLE2 t2 ON t1.Id = t2.Id
WHERE
t1.StatusId = 12
Run Code Online (Sandbox Code Playgroud)
2)
FROM TABLE1 t1
INNER JOIN TABLE2 t2 ON t1.Id = t2.Id
AND t1.StatusId = 12
Run Code Online (Sandbox Code Playgroud)
在INNER JOIN中执行此操作时,这没有任何区别.
但是,当您使用LEFT或RIGHT JOIN,它确实有所作为无论你把额外的过滤器进入JOIN或到WHERE子句.
将筛选器放入WHERE子句时,SQL Server首先执行连接,然后完全筛选出筛选器不适合的行.
- >这会减少返回的行数
当您将过滤器放入JOIN时,SQL Server会在连接期间执行过滤,但仅限于放置过滤器的表.
您仍然可以从其他表中获取所有行,但只有那些具有过滤器适合的过滤表中的数据的行.
- >这不会减少行数,但是包含filteres表数据的列在更多行中将为空
很难解释......为了更清楚,这是一个例子:
从RedFilter的答案中获取样本数据:
CREATE TABLE [dbo].[t1](
[ID] [int] NULL,
[StatusID] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[t2](
[ID] [int] NULL
) ON [PRIMARY]
INSERT INTO t1 (ID, StatusID) VALUES (1, 10)
INSERT INTO t1 (ID, StatusID) VALUES (2, 11)
INSERT INTO t1 (ID, StatusID) VALUES (3, 12)
INSERT INTO t1 (ID, StatusID) VALUES (4, 12)
INSERT INTO t2 (ID) VALUES (1)
INSERT INTO t2 (ID) VALUES (3)
INSERT INTO t2 (ID) VALUES (5)
Run Code Online (Sandbox Code Playgroud)
...并对其运行以下查询:
/* this returns four rows, but only two will have data
from the second table in the second column */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
/* this returns only one row: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
WHERE t2.ID = 1
/* this returns four rows as in the first query, but only one
row will have data in the second column: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
AND t2.ID = 1
Run Code Online (Sandbox Code Playgroud)
请注意评论中指出的不同结果.
这些查询应返回相同的结果.请发布完整的查询.
以下示例展示了两种变体的相同输出:
样品:
CREATE TABLE [dbo].[t1](
[ID] [int] NULL,
[StatusID] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[t2](
[ID] [int] NULL
) ON [PRIMARY]
INSERT INTO t1 (ID, StatusID) VALUES (1, 10)
INSERT INTO t1 (ID, StatusID) VALUES (2, 11)
INSERT INTO t1 (ID, StatusID) VALUES (3, 12)
INSERT INTO t1 (ID, StatusID) VALUES (4, 12)
INSERT INTO t2 (ID) VALUES (1)
INSERT INTO t2 (ID) VALUES (3)
INSERT INTO t2 (ID) VALUES (5)
SELECT t1.ID, t1.StatusID
FROM t1
INNER JOIN t2 ON t1.Id = t2.Id
WHERE t1.StatusId = 12
SELECT t1.ID, t1.StatusID
FROM t1
INNER JOIN t2 ON t1.Id = t2.Id
AND t1.StatusId = 12
Run Code Online (Sandbox Code Playgroud)
输出:
ID StatusID
----------- -----------
3 12
(1 row(s) affected)
ID StatusID
----------- -----------
3 12
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)