UNION,EXISTS,IN等在SQL语句中的灵活应用和场境的选择。
2005-11-22 09:24
465 查看
今天在QQ群里,有朋友问我这样的一个SQL Server中查询数据的问题,
表 A:
num unit
001 a
002 b
003 c
表 B:
num unit
001 d
查询显示结果
001 d
002 b
003 c
怎么实现?
看了这个问题第一感觉是,有点难度。
不过要表达的意思很明白:匹配的显示b,不匹配显示a.
问题来了,简单的SQL语句中无法找到这样的查询方式能完成这项工作,不回答别人吧,又难受。说不会,显得很没面子。怎么办呢?
于是以最短的时间分析了下,发现我可以分成两个查询两完成工作。
即:SELECT a.num, b.unit
FROM a INNER JOIN
b ON a.num = b.num
和
SELECT DISTINCT a.num, a.unit
FROM a WHERE a.num NOT IN
(SELECT b.num
FROM b)
而清楚的记得union可以将两个集合合并,只要集合的字段数目和类型是一样的。
那就好办,于是写下:
SELECT a.num, b.unit
FROM a INNER JOIN
b ON a.num = b.num
UNION
SELECT DISTINCT a.num, a.unit
FROM a WHERE a.num NOT IN
(SELECT b.num
FROM b)
测试执行,搞定。
如果字段多,写起来麻烦,想使用*,则部分数据冗余的写法是:
SELECT a.*, b.unit AS extend
FROM a INNER JOIN
b ON a.num = b.num
UNION
SELECT DISTINCT a.*, a.unit AS extend
FROM a WHERE a.num NOT IN
(SELECT b.num
FROM b)
本以为问题就这样解决了,但问题又来了,原因是这对单个字段是唯一键或主键时有效,如果唯一键是两个或两个以上的字段组成就不行了。
如
表 A:
num num2 unit
001 a a
002 b b
003 c c
表 B:
num num2 unit
001 a d
查询显示结果
num num1 unit
001 a d
002 b b
003 c c
于是改写成
SELECT a.*, b.unit AS extend
FROM a INNER JOIN
b ON a.num = b.num and a.num1 = b.num1
UNION
SELECT DISTINCT a.*, a.unit AS extend
FROM a
WHERE not exists
(SELECT * from b where a.num=b.num and a.num1=b.num1)
表 A:
num unit
001 a
002 b
003 c
表 B:
num unit
001 d
查询显示结果
001 d
002 b
003 c
怎么实现?
看了这个问题第一感觉是,有点难度。
不过要表达的意思很明白:匹配的显示b,不匹配显示a.
问题来了,简单的SQL语句中无法找到这样的查询方式能完成这项工作,不回答别人吧,又难受。说不会,显得很没面子。怎么办呢?
于是以最短的时间分析了下,发现我可以分成两个查询两完成工作。
即:SELECT a.num, b.unit
FROM a INNER JOIN
b ON a.num = b.num
和
SELECT DISTINCT a.num, a.unit
FROM a WHERE a.num NOT IN
(SELECT b.num
FROM b)
而清楚的记得union可以将两个集合合并,只要集合的字段数目和类型是一样的。
那就好办,于是写下:
SELECT a.num, b.unit
FROM a INNER JOIN
b ON a.num = b.num
UNION
SELECT DISTINCT a.num, a.unit
FROM a WHERE a.num NOT IN
(SELECT b.num
FROM b)
测试执行,搞定。
如果字段多,写起来麻烦,想使用*,则部分数据冗余的写法是:
SELECT a.*, b.unit AS extend
FROM a INNER JOIN
b ON a.num = b.num
UNION
SELECT DISTINCT a.*, a.unit AS extend
FROM a WHERE a.num NOT IN
(SELECT b.num
FROM b)
本以为问题就这样解决了,但问题又来了,原因是这对单个字段是唯一键或主键时有效,如果唯一键是两个或两个以上的字段组成就不行了。
如
表 A:
num num2 unit
001 a a
002 b b
003 c c
表 B:
num num2 unit
001 a d
查询显示结果
num num1 unit
001 a d
002 b b
003 c c
于是改写成
SELECT a.*, b.unit AS extend
FROM a INNER JOIN
b ON a.num = b.num and a.num1 = b.num1
UNION
SELECT DISTINCT a.*, a.unit AS extend
FROM a
WHERE not exists
(SELECT * from b where a.num=b.num and a.num1=b.num1)
相关文章推荐
- Sql语句中IN和exists的区别及应用
- Sql语句中IN和exists的区别及应用
- Sql语句中IN和exists的区别及应用
- Sql语句中IN和exists的区别及应用
- Sql语句中IN和exists的区别及应用
- Sql语句中IN和exists的区别及应用
- SQL 语句中 IN 和 exists 区别
- LINQ to SQL语句(7)之Exists/In/Any/All/Contains
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- LINQ体验(7)--LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Conta...
- LINQ体验(7)――LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- sql查询语句中 in和 exists的区别与性能比较
- sql语句中的exists和in
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- SQL 语句优化 --将Exists转换成 inner join 语句来选择正确的执行计划
- sql语句 in和exists的区别
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains