如何判断多个字段组成的关键字在另外一张表中是否存在

简介: 如何判断多个字段组成的关键字在另外一张表中是否存在老帅(20141107)1.首先判断一个关键字在另外一张表中是否存在很容易!SELECT * FROM a WHERE a.ID IN (SELECT b.ID FROM b)2.如果判断的关键字有多个字段构成怎么办呢?你不能在IN中使用多个字段。

如何判断多个字段组成的关键字在另外一张表中是否存在

老帅(20141107)

1.首先判断一个关键字在另外一张表中是否存在很容易!

SELECT * FROM a 

WHERE a.ID 

IN

 (

SELECT b.ID 

FROM b

)


2.如果判断的关键字有多个字段构成怎么办呢?

你不能在IN中使用多个字段。如下查询:

SELECT * FROM a

WHERE (a.ID1, a.ID2) 

IN

(

SELECT b.ID1, b.ID2

FROM b

)

这不会正常工作,违反了SQLSERVER标准。


3.要解决这一问题,可以用EXISTS来代替IN!

SELECT * FROM a

WHERE EXISTS

(

SELECT NULL

FROM b

WHERE a.ID1 = b.ID1

AND a.ID2 = b.ID2

)


4.值得注意的是,这仅适用于IN,而非NOT IN!

NOT IN与NOT EXISTS在处理空值的方式上略有不同。

SELECT *

FROM a

WHERE (a.ID1, a.ID2) NOT IN

(

SELECT b.ID1, b.ID2

FROM b

)

这不会正常工作,违反了SQLSERVER标准。要模仿NOT IN的查询如下:

我们必须使用以下查询:

SELECT *

FROM a

WHERE NOT EXISTS

(

SELECT NULL

FROM b

WHERE a.ID1 = b.ID1

AND a.ID2 = b.ID2

)

AND NOT EXISTS

(

SELECT NULL

FROM b

WHERE b.ID1 IS NULL 

OR b.ID2 IS NULL

)

第二个谓词确保b在ID1和ID2中不会有空值,任何这样的值都会让原始查询不会返回结果!

相关文章
|
9天前
|
存储 关系型数据库 索引
10. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?
在非主键字段上创建索引,查询数据通常需两次。对于MyISAM,先通过索引找到数据行指针,再获取数据;而InnoDB则先找主键ID,再从主键索引中查找数据。
11 0
|
2月前
|
SQL
Sql语法:字段不为空
Sql语法:字段不为空
|
6月前
|
SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
26 0
|
9月前
PostpreSQL系统表中的字段
每天学习一点点
55 0
|
11月前
|
存储 关系型数据库 MySQL
mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题
mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题
209 0
获取表的所有字段属性
获取表的所有字段属性
|
XML Java 数据库连接
解决表的列名和对象的属性名不匹配
解决表的列名和对象的属性名不匹配
115 0
解决表的列名和对象的属性名不匹配
合并查询结果与为表和字段取别名
合并查询结果与为表和字段取别名
141 0
合并查询结果与为表和字段取别名
|
关系型数据库 MySQL
mysql更新一个表中的姓名字段,随机取出姓,名部分截取该表中另外一个字段拼接...
mysql更新一个表中的姓名字段,随机取出姓,名部分截取该表中另外一个字段拼接...
218 0
mysql更新一个表中的姓名字段,随机取出姓,名部分截取该表中另外一个字段拼接...