SQL Server 一些关键字详解(二)

1.LEFT JOIN 容易让人误解的地方

背景:因为在网上搜了下 LEFT JOIN 和 OUTER APPLY 的区别,时发现,有的网友解释为:

  1) A   left  join  B  的连接的记录数与A表的记录数同.

  2) LEFT JOIN 左连接 -- 显示左表所有存在的记录 记录数=左表.

像这些说法都不对的.根据我测试得出的结论应该是:

  LEFT JOIN 返回结果数 >= 左表的记录数

网上有部分人的解释都漏了 大于(>) 的那部分,后我找了下感觉比较权威的答案:

W3School中的解释为:

  LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

在百度百科解释为:

  left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的。换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地方均为NULL。

好像都没有明显的说到:当左表的数据,在右表匹配到多条记录的情况,这样就很容易让人误解.下面我做了个例子,

  比如有个类别表(Category)内容如下:

  还有个类别明细表(CategoryDetail)内容如下:

  那好现在测试开始:

  可以看到,本来左表(Category)里面只有三条数据的,使用了LEFT JOIN之后带出了四条数据,其中多出的就是对应左表(Category)匹配右表(CategoryDetail)数据时,出现多条数据的情况.

2.JOIN 使用时要注意的地方

  一般我们使用JOIN 时都是直接一个表名, ON 后面加条件如下:

  但是有时候也会这么写:

  这时候好像没什么问题,好的,要是再加个条件 把两个表关联起来,那么问题来了,假如我是这样写:

1 SELECT * FROM dbo.Category a
2 LEFT JOIN (SELECT * FROM dbo.CategoryDetail b WHERE b.Id=1 AND b.CategoryId=a.Id) AS c  ON 1=1

  这时候就就会很郁闷的发现报错了,报错如下:

  为什么会出现: 無法繫結多重部分(Multi-Part) 識別碼"a.Id"。 错呢?我发现凡是适用JOIN时使用 括号() 然后在里面加select 语句时如果在使用外面的字段,就会报这个问题:

比如使用CROSS JOIN:

使用RIGHT JOIN:

使用INNER JOIN:

使用FULL JOIN:

  总结:使用JOIN关键字时,如果不是直接JOIN一个表名而是,使用圆括号() 里面加select 语句时,关联外部表字段时,就会出现: 無法繫結多重部分(Multi-Part) 識別碼 问题.

附注

附帶SQL腳本一份:

 1 /****** Object:  Table [dbo].[CategoryDetail]    Script Date: 08/19/2015 19:46:37 ******/
 2 SET ANSI_NULLS ON
 3 GO
 4 SET QUOTED_IDENTIFIER ON
 5 GO
 6 SET ANSI_PADDING ON
 7 GO
 8 CREATE TABLE [dbo].[CategoryDetail](
 9     [Id] [int] IDENTITY(1,1) NOT NULL,
10     [CategoryId] [int] NULL,
11     [Cry] [varchar](50) NULL,
12  CONSTRAINT [PK_CategoryDetail] PRIMARY KEY CLUSTERED
13 (
14     [Id] ASC
15 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
16 ) ON [PRIMARY]
17 GO
18 SET ANSI_PADDING OFF
19 GO
20 SET IDENTITY_INSERT [dbo].[CategoryDetail] ON
21 INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (1, 1, N‘喵‘)
22 INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (2, 2, N‘汪‘)
23 INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (3, 2, N‘汪汪‘)
24 SET IDENTITY_INSERT [dbo].[CategoryDetail] OFF
25 /****** Object:  Table [dbo].[Category]    Script Date: 08/19/2015 19:46:36 ******/
26 SET ANSI_NULLS ON
27 GO
28 SET QUOTED_IDENTIFIER ON
29 GO
30 SET ANSI_PADDING ON
31 GO
32 CREATE TABLE [dbo].[Category](
33     [Id] [int] IDENTITY(1,1) NOT NULL,
34     [Name] [varchar](50) NULL,
35  CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED
36 (
37     [Id] ASC
38 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
39 ) ON [PRIMARY]
40 GO
41 SET ANSI_PADDING OFF
42 GO
43 SET IDENTITY_INSERT [dbo].[Category] ON
44 INSERT [dbo].[Category] ([Id], [Name]) VALUES (1, N‘Cat‘)
45 INSERT [dbo].[Category] ([Id], [Name]) VALUES (2, N‘Dog‘)
46 INSERT [dbo].[Category] ([Id], [Name]) VALUES (3, N‘Tiger‘)
47 SET IDENTITY_INSERT [dbo].[Category] OFF

时间: 2025-01-02 18:38:29

SQL Server 一些关键字详解(二)的相关文章

SQL Server表分区详解

原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等.但是数据量少的数据就不要凑这个热

JDBC连接SQL Server 2005步骤详解

一.设置SQL Server服务器:    1."开始" → "程序" → "Microsoft SQL Server 2005" → "配置工具" → "SQL Server Configuration Manager"(确认"SQL Server Management Studio"已关闭)    2."SQL Server 2005 服务"中停止服务"

SQL Server with(nolock)详解

原文:SQL Server with(nolock)详解 大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的. 什么是并发访问:同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如: 1:脏读,一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读. 2:不可重

SQL Server:触发器详解

SQL Server:触发器详解 1. 概述 2. 触发器的分类 3. Inserted和Deleted表 4. 触发器的执行过程 5. 创建触发器 6. 修改触发器: 7. 删除触发器: 8. 查看数据库中已有触发器: 9. “Instead of”相关示例: 10. “After”触发器 11. 参考资源 1. 概述 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活. 所以触发器可以用来实现对表实施复杂的完整性约束. 2. 触发器的分类

Sql Server之数据类型详解

  数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为不同的类型可以节省磁盘空间和资源.  Sql Server 还能自动限制每个数据类型的取值范围,例如定义了一个类型为int的字段,如果插入数据时插入的值的大小在smallint或者tinyint范围之内, Sql Server 会自动将类型转换为smallint 或者tinyint,这样一来,在存储

SQL Server 字符串 参数详解

1:Integrated Security参数     当设置Integrated Security为 True 的时候,连接语句前面的 UserID, PWD 是不起作用的,即采用windows身份验证模式.     只有设置为 False 或省略该项的时候,才按照 UserID, PWD 来连接.     Integrated Security 还可以设置为:sspi ,相当于 True,建议用这个代替 True. 2:参数Trusted_Connection     Trusted_Con

Java调用SQL Server的存储过程详解

转载自Microsoft的官方文档 http://msdn2.microsoft.com/zh-cn/library/ms378995.aspx收录于 www.enjoyjava.net/f25 本文较长,包含了如下几部分 使用不带参数的存储过程 使用带有输入参数的存储过程 使用带有输出参数的存储过程 使用带有返回状态的存储过程 使用带有更新计数的存储过程 1使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义

SQL Server计数器属性详解

常规计数器 收集操作系统服务器的服务器性能信息,包括Processor.磁盘.网络.内存 Processor 处理器 1.1 % Processor Time指处理器用来执行非闲置线程时间的百分比.通过此计数器可以确定服务器当前CPU使用百分比. 1.2 % Privileged Time是在特权模式下进程线程执行代码所花时间的百分比.当调用 Windows 系统服务时,此服务经常在特权模式运行,以便获取对系统专有数据的访问. PhysicalDisk物理磁盘(某个RAID) 2.1 Avg.

Cacti 监控 SQL Server 数据库图文详解

模板下载: (1)可以直接下载本站发布的 Cnyunwei-Cacti+Nagios 集成全自动安装ISO进行安装,已集成此模板及更多的使用插件模板(2)可以直接去官方论坛下载最新的模板 http://forums.cacti.net/viewtopic.php?f=12&t=38135 php-mssql配置: cacti的机器上必须有php-mssql驱动php -m | grep mssql 查看是否有mssql,如没有安装的话,直接yum安装即可 yum install php-mssq