何时在查询中使用交集
when to use intersect in a query
我对什么时候必须在 sql.The 中使用相交感到有点困惑,我得到的示例如下:
我有两个表:
MovieStar(name, address, gender, birthdate)
MovieExec(name, address, cert#, netWorth)
这个例子要求找到所有的女演员的姓名和地址,同时也是电影执行人并且拥有超过10000000.The的净资产,书中例子的解决方案如下:
(SELECT name, address
FROM MovieStar
WHERE gender = 'F')
INTERSECT
(SELECT name, address
FROM MovieExec
WHERE netWorth > 10000000);
所以我的问题是为什么我必须使用 INTERSECT 而我可以使用 "AND" 运算符,例如:
SELECT name, address
FROM MovieStar, MovieExec
WHERE gender = 'F' AND netWorth > 10000000
有没有什么巧妙的方法可以确定什么时候使用 INTERSECT 或 "AND" 更好?
在适合您的情况下使用 INTERSECT
,您会得到正确的结果。其次始终比较执行计划和统计信息,因为获得结果的方式可能会有所不同。
1)
SELECT name, address
FROM MovieStar
WHERE gender = 'F'
INTERSECT
SELECT name, address
FROM MovieExec
WHERE netWorth > 10000000;
意思是从MovieStar取名字和地址,性别是'F',
从 MovieExec 中获取名称和地址,其中 networth > 100000 并找到两组中的记录。
2)
SELECT ms.name, ms.address
FROM MovieStar AS ms, MovieExec AS me
WHERE gender = 'F' AND netWorth > 10000000
这意味着您生成 CROSS JOIN
笛卡尔积(MxN 条记录),然后只获取性别 = 'F' AND netWorth > 10000000
的记录
我想第一种方法 returns 结果会更快并且使用更少的内存(但查询优化器可以做很多事情)。
什么时候应该使用INTERSECT
:
- 您想获得两个集合的交集,但您不能显式加入它们
我对什么时候必须在 sql.The 中使用相交感到有点困惑,我得到的示例如下:
我有两个表:
MovieStar(name, address, gender, birthdate)
MovieExec(name, address, cert#, netWorth)
这个例子要求找到所有的女演员的姓名和地址,同时也是电影执行人并且拥有超过10000000.The的净资产,书中例子的解决方案如下:
(SELECT name, address
FROM MovieStar
WHERE gender = 'F')
INTERSECT
(SELECT name, address
FROM MovieExec
WHERE netWorth > 10000000);
所以我的问题是为什么我必须使用 INTERSECT 而我可以使用 "AND" 运算符,例如:
SELECT name, address
FROM MovieStar, MovieExec
WHERE gender = 'F' AND netWorth > 10000000
有没有什么巧妙的方法可以确定什么时候使用 INTERSECT 或 "AND" 更好?
在适合您的情况下使用 INTERSECT
,您会得到正确的结果。其次始终比较执行计划和统计信息,因为获得结果的方式可能会有所不同。
1)
SELECT name, address
FROM MovieStar
WHERE gender = 'F'
INTERSECT
SELECT name, address
FROM MovieExec
WHERE netWorth > 10000000;
意思是从MovieStar取名字和地址,性别是'F', 从 MovieExec 中获取名称和地址,其中 networth > 100000 并找到两组中的记录。
2)
SELECT ms.name, ms.address
FROM MovieStar AS ms, MovieExec AS me
WHERE gender = 'F' AND netWorth > 10000000
这意味着您生成 CROSS JOIN
笛卡尔积(MxN 条记录),然后只获取性别 = 'F' AND netWorth > 10000000
我想第一种方法 returns 结果会更快并且使用更少的内存(但查询优化器可以做很多事情)。
什么时候应该使用INTERSECT
:
- 您想获得两个集合的交集,但您不能显式加入它们