如果我们击穿你想要做什么:
3210给人的第一价值,除非为null,则第二等您还没有指定任何连接条件,所以你做在emp
和salgrade
之间的cartesian join
。这将返回行数emp
乘以行数salgrade
;受你的加入条件。
查询的第二部分在相反的方向上完全相同。
假设的table_structure:
create table emp (
emp_id number
, salary number -- current salary
, salgrade_id number -- current salary grade
, dept_id -- current department
);
create table salgrade (
, salgrade_id number
, hisal number -- max salary for that grade
);
你想要做这样的事情:
select least(e.salary * 1.15, s.hisal)
from emp e
join salgrade s
on e.salgrade_id = s.salgrade_id
的least
function类似于min
;因为它将取最小值。但是,它可以处理同一行上的多个列,而不是同一列上的多个行。
通过采取hisal
的least
和salary * 1.15
我们保证,如果工资的增长是高于hisal
然后hisal
改为使用。
在这种情况下,join
意味着,每emp_id
我们采取hisal
为适当的薪金等级。我强烈推荐reading up on SQL joins - 这个链接在谷歌上排名第7,这有些让人吃惊(杰夫似乎无处不在),但它很不错,还有更多的链接。
更改查询,让你这样做对收入超过10万的所有员工(富者愈富),它会是这个样子:
select least(e.salary * 1.15, s.hisal)
from emp e
join salgrade s
on e.salgrade_id = s.salgrade_id
where e.salary > 100000
或者使问题复杂化,如果你想做到这一点仅IT人民(为什么不),你可以把它扩展到是这样的:通过被inner joins
,而不是outer joins
select least(e.salary * 1.15, s.hisal)
from emp e
join salgrade s
on e.salgrade_id = s.salgrade_id
join dept d
on e.dept_id = d.dept_id
where d.dept = 'IT'
这些连接(通常left outer joins
- 见链接),意味着每一位员工有一个等级和一个部门。
来源
2012-02-19 16:07:31
Ben
加入名字是一种造成非常大的错误的方法,您需要使用唯一的标识符,并且名称不保证是唯一的。当我发现38时,我厌倦了计算Pratik Garg在Facebook上注册的数量。 – Ben 2012-02-19 16:22:52
这只是暗示不是一个合适的查询。 我在告诉你,因为没有子查询而得到多行异常条件.. 如果你将添加这些条件,那么你会得到单行(最有可能....如果你没有多个记录在你的表中的客户..) – 2012-02-19 18:13:20