h*********n 发帖数: 915 | 1 【 以下文字转载自 JobHunting 讨论区 】
发信人: heavyburden (nothing), 信区: JobHunting
标 题: 再请教SQL问题
发信站: BBS 未名空间站 (Fri Mar 16 02:59:28 2012, 美东)
table Orders:
primary key order_id, foreign key customer_id
table Customers:
primary key customer_id, name, address
find out if there's any customer not having any order.
single query, and no nested query allowed. |
F**e 发帖数: 593 | 2 SELECT c.customer_id
FROM Customers c
RIGHT JOIN Orders o
USING (customer_id)
WHERE o.order_id IS NULL;
【在 h*********n 的大作中提到】 : 【 以下文字转载自 JobHunting 讨论区 】 : 发信人: heavyburden (nothing), 信区: JobHunting : 标 题: 再请教SQL问题 : 发信站: BBS 未名空间站 (Fri Mar 16 02:59:28 2012, 美东) : table Orders: : primary key order_id, foreign key customer_id : table Customers: : primary key customer_id, name, address : find out if there's any customer not having any order. : single query, and no nested query allowed.
|
h*********n 发帖数: 915 | 3 蛋定老兄SQL很熟啊。
再来一个:学生编号,课程,成绩。判断是否有一个学生所有成绩没有F也没有A。每个
学生选的课可能不同。
Records: Id, Course, Grade
【在 F**e 的大作中提到】 : SELECT c.customer_id : FROM Customers c : RIGHT JOIN Orders o : USING (customer_id) : WHERE o.order_id IS NULL;
|
M*m 发帖数: 141 | 4 select id
from T
group by id
having max(grade) <> 'A' and min(grade) <> 'A' and max(grade) <> 'F' and min
(grade) <> 'F' |
h*********n 发帖数: 915 | 5 您这个不对。算出来的是至少有一门成绩在B和D之间的所有学生。
要找一个学生,他的所有成绩都在B和D之间。
min
【在 M*m 的大作中提到】 : select id : from T : group by id : having max(grade) <> 'A' and min(grade) <> 'A' and max(grade) <> 'F' and min : (grade) <> 'F'
|
s********o 发帖数: 861 | 6 select count(1)
from T
group by id
having min(grade) > 'A' and max(grade) < 'F'
假设grade是个单字符的string. A-F.
【在 h*********n 的大作中提到】 : 您这个不对。算出来的是至少有一门成绩在B和D之间的所有学生。 : 要找一个学生,他的所有成绩都在B和D之间。 : : min
|
s********o 发帖数: 861 | 7 不许用nested query只是面试问题。实际工作中用不着自己折磨自己,尽管用好了。正
确的nested query没有 performance problem. |
h*********n 发帖数: 915 | 8 您和楼上的答案没区别,找的还是“所有……至少……”,而不是“至少……所有……”
比如:
张三 数学 B
张三 语文 A
李四 数学 B
李四 语文 B
我要找李四,您的答案张三李四都出来了。
【在 s********o 的大作中提到】 : select count(1) : from T : group by id : having min(grade) > 'A' and max(grade) < 'F' : 假设grade是个单字符的string. A-F.
|
h*********n 发帖数: 915 | 9 不能用join完成吗?
【在 s********o 的大作中提到】 : 不许用nested query只是面试问题。实际工作中用不着自己折磨自己,尽管用好了。正 : 确的nested query没有 performance problem.
|
F**e 发帖数: 593 | 10 use my previous trick:
SELECT id, SUM(IF(Grade='A' OR Grade='F', 1, 0)) AS sum_A_F
FROM Records
GROUP BY id
HAVING sum_A_F=0;
【在 h*********n 的大作中提到】 : 蛋定老兄SQL很熟啊。 : 再来一个:学生编号,课程,成绩。判断是否有一个学生所有成绩没有F也没有A。每个 : 学生选的课可能不同。 : Records: Id, Course, Grade
|
s********o 发帖数: 861 | 11 您错了。张三出不来,因为张三min(grade) = 'A',所以这个group 不满足having min
(grade) > 'A'。
…”
【在 h*********n 的大作中提到】 : 您和楼上的答案没区别,找的还是“所有……至少……”,而不是“至少……所有……” : 比如: : 张三 数学 B : 张三 语文 A : 李四 数学 B : 李四 语文 B : 我要找李四,您的答案张三李四都出来了。
|
a******o 发帖数: 16625 | 12 恩,这个不用IF不行。
【在 F**e 的大作中提到】 : use my previous trick: : SELECT id, SUM(IF(Grade='A' OR Grade='F', 1, 0)) AS sum_A_F : FROM Records : GROUP BY id : HAVING sum_A_F=0;
|