返回信息流有这么个表Loans,有三个属性loan_nbr , payment_nbr , payment_status ,其中loan_nbr 和payment_nbr为复合主键, 现在我要找出所有状态为‘F’,也就是payment_status 全为‘F’的所有loan_nbr。
+----------+-------------+----------------+
| loan_nbr | payment_nbr | payment_status |
+----------+-------------+----------------+
| 1 | 1 | F |
| 1 | 2 | F |
| 1 | 3 | s |
| 2 | 1 | u |
| 3 | 1 | F |
+----------+-------------+----------------+
我在mysql里用关联子查询:
mysql> select distinct
(select L1.loan_nbr
from Loans AS L1
where L1.loan_nbr=L2.loan_nbr
group by L1.loan_nbr
having count(L1.payment_status) = count(L2.loan_nbr))
as parent
from Loans as L2
where L2.payment_status='F'
group by L2.loan_nbr;
思路就是先找出payment_status='F'的所有行,然后在子查询中与Loan对比,只要他们的count相等,就取出该行,但是这个语句得出的结果总是null,不知道为什么?
注:这是在《sql编程风格》里的一个例子,我知道该需求有更好的实现办法,但是我就是想弄明白这个关联子查询的方法为什么不行?
这是一条镜像帖。来源:北邮人论坛 / database / #4249同步于 2010/3/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
关联子查询的问题
bygones
2010/3/5镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
SELECT DISTINCT(loan_nbf) WHERE payment_status = 'F';
【 在 bygones (雪地撒野) 的大作中提到: 】
: 标 题: 关联子查询的问题
: 发信站: 北邮人论坛 (Fri Mar 5 14:04:47 2010), 站内
:
: 有这么个表Loans,有三个属性loan_nbr , payment_nbr , payment_status ,其中loan_nbr 和payment_nbr为复合主键, 现在我要找出所有状态为‘F’,也就是payment_status 全为‘F’的所有loan_nbr。
: +----------+-------------+----------------+
: | loan_nbr | payment_nbr | payment_status |
: +----------+-------------+----------------+
: | 1 | 1 | F |
: | 1 | 2 | F |
: | 1 | 3 | s |
: | 2 | 1 | u |
: | 3 | 1 | F |
: +----------+-------------+----------------+
:
: 我在mysql里用关联子查询:
: mysql> select distinct
: (select L1.loan_nbr
: from Loans AS L1
: where L1.loan_nbr=L2.loan_nbr
: group by L1.loan_nbr
: having count(L1.payment_status) = count(L2.loan_nbr))
: as parent
: from Loans as L2
: where L2.payment_status='F'
: group by L2.loan_nbr;
:
: 思路就是先找出payment_status='F'的所有行,然后在子查询中与Loan对比,只要他们的count相等,就取出该行,但是这个语句得出的结果总是null,不知道为什么?
:
: 注:这是在《sql编程风格》里的一个例子,我知道该需求有更好的实现办法,但是我就是想弄明白这个关联子查询的方法为什么不行?
: --
:
: ※ 修改:·bygones 于 Mar 5 14:08:48 2010 修改本文·[FROM: 2001:da8:215:8813:8165:ffc:a700:*]
: ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 2001:da8:215:8813:8165:ffc:a700:*]
你这个查询的是含有payment_status = 'F'的loan_nbf,你会把loan_nbf为1的行也选出来的!我要的是所有payment_status 都是‘F’的loan_nbf。
我给出的这个查询其实是书上的原例,但是我输进mysql后发现有问题,所以就拿上来问问,其实这个东西可以用更简单的方法做,直接利用max(payment_status )=min(payment_status ) and max(payment_status )='F'就可以了,只不过我想知道书上这个例子错在哪儿了。
【 在 coolfantasy 的大作中提到: 】
: SELECT DISTINCT(loan_nbf) WHERE payment_status = 'F';
多谢,不过其实方法是有的,比如下面这个:
select loan_nbr from Loans where max(payment_status )=min(payment_status ) and max(payment_status )='F'
就可以了,只是我想知道group by是否不能用在标量子查询里,因为我以后可能会用到标量子查询中使用group by的情况,所以得先确认下到底能不能这么做。
【 在 coolfantasy 的大作中提到: 】
: 那考虑一下 NOT IN 吧