日期:2014-05-18  浏览次数:20678 次

不太明白这句SQL的意思,请帮忙!
我原来写的SQL
SELECT zy_detail_charge.ward_code,zy_bill_item.code,sum(zy_detail_charge.charge_fee) 
FROM  
zd_charge_item ,zy_detail_charge ,zy_bill_item, 
(select distinct inpatient_no,admiss_times,ledger_sn from zy_receipt  
where account_date >= '2007-01-01 ' and account_date < '2007-02-01 ' ) a 
WHERE ( zy_detail_charge.charge_code = zd_charge_item.code ) and  
 ( zd_charge_item.bill_item_code = zy_bill_item.code ) and  
( zy_detail_charge.inpatient_no = a.inpatient_no ) AND  
( zy_detail_charge.admiss_times = a.admiss_times ) AND  
( zy_detail_charge.ledger_sn = a.ledger_sn ) AND 
  zy_detail_charge.charge_status = '3 ' and  
 zy_detail_charge.ward_code = '3020100 ' 
GROUP BY zy_detail_charge.ward_code, 
  zy_bill_item.code; 

后来改为:
SELECT  
  b.ward_code,
  c.code,
  sum(b.charge_fee) 
FROM  
  zd_charge_item a
join
  zy_detail_charge b on b.charge_code=a.Code
join
  zy_bill_item c on a.bill_item_code=c.Code
where
  exists(select 1 from zy_receipt where inpatient_no=b.inpatient_no and admiss_times=b.admiss_times and ledger_sn= b.ledger_sn
  and account_date between '2007-01-01 ' and '2007-01-31 23:59:59') and b.charge_status=3 and b.ward_code='3020100'
group by  
  b.ward_code,c.code


问题:1. 新的语句中join 是内联,还是外联、左联、右联?
  2. 不明白exits的意思。 在SQL的帮助里是说检查行的存在性,也就是是否存在。但例子中与IN的对比,也就是存在于。如果解析成是否存在,那新语句中的 exists子查询没有行返回的话,是不是整个语句就会返回空集。如果解析成存在于,是那个表中,根据那些条件,去存在于exists子查询返回集,SQL SERVER会自动选择吗? 根据我旧的语句推理的。那么新语句中的from zd_charge_item a join zy_detail_charge b join zy_bill_item c,这里的顺序没有规定,还是随便的?
  3. 如果是存在于的话,exists中的select 1 应该是 select *。我测试过,用select 1 或是用select * ,整个sql语句的结果都是一样的。不明白呀。

------解决方案--------------------
1 join 就是普通的表连接,左连接要用left join
2 exits返回的事true or false,用于条件语句的判断,如果不存在的话,整个语句就返回空集
3 select 1 和 select * 执行的结果确实是一样的,用select 1是为了提高效率
------解决方案--------------------
问题:1. 新的语句中join 是内联,还是外联、左联、右联?
-------------------
内连 和a.id = b.id是一个意思. 
2. 不明白exits的意思。 在SQL的帮助里是说检查行的存在性,也就是是否存在。但例子中与IN的对比,也就是存在于。如果解析成是否存在,那新语句中的 exists子查询没有行返回的话,是不是整个语句就会返回空集。如果解析成存在于,是那个表中,根据那些条件,去存在于exists子查询返回集,SQL SERVER会自动选择吗? 根据我旧的语句推理的。那么新语句中的from zd_charge_item a join zy_detail_charge b join zy_bill_item c,这里的顺序没有规定,还是随便的? 
---------------
存在记录,返回TRUE,不存在,返回false
3. 如果是存在于的话,exists中的select 1 应该是 select *。我测试过,用select 1 或是用select * ,整个sql语句的结果都是一样的。不明白呀。
---------------
select 1,select * 是一个意思.如上所说,select 1比select * 快.
------解决方案--------------------
join就是普通的连接,没有过滤的

exists 满足就为true 否则 为false

select*的代价比较大。