SQL高手在哪? (100分)

  • 主题发起人 主题发起人 清嘴
  • 开始时间 开始时间

清嘴

Unregistered / Unconfirmed
GUEST, unregistred user!
有两个表 a(id,aa,bb),b(id,aa,bb)
//==============================
表a
id aa bb
--------------------------------
1 1001 2000
//==============================
表b
id aa bb
1 1003 1050
1 1100 1150
1 1151 1900

现根据ID进行关联,要得到b表在a表中不存在的区段,即结果如下:
id aa bb
1 1001 1002
1 1051 1099
1 1901 2000

有没有较好的分析方法,贴出来大家切磋切磋!
 
select * from b where id not in (select a.id from a,b where a.id=b.id
and a.aa<>b.aa and a.bb<>b.bb)
如不正确,请把题目说清楚
 
不明白什么意思!
1002,1051,1099这些数在原来的两个表都没有呀
 
up
b表区段会交叉吗?
 
楼主要干吗?不理解,同楼上
 
我觉得不如建一个临时表,再查询临时表中的数据.
 
SELECT e.*
FROM (SELECT c.id, c.cc aa,
(SELECT MIN(d .aa)
FROM b d
WHERE d .aa >= c.cc AND d .id = c.id) - 1 bb
FROM (SELECT id, bb + 1 cc
FROM b) c) e
WHERE e.bb IS NOT NULL AND e.bb >= e.aa
UNION
SELECT b.id, a.aa, MIN(b.aa) - 1
FROM b, a
WHERE a.id = b.id
GROUP BY b.id, a.aa
HAVING MIN(b.aa) > a.aa
UNION
SELECT b.id, MAX(b.bb) + 1, (a.bb)
FROM b, a
WHERE a.id = b.id
GROUP BY b.id, a.bb
HAVING a.bb > MAX(b.bb)

此SQL语句能在MSSQL运行,且字段AA和BB都为INT型
 
其实这个问题时票据问题的一个典型例子。
如:A表 是领票据的连续编号1001---2000;
b表 就是票据核销的部分票据
下在就是要求得还有那些票据没有核销。
这个问题 在库房管理:物品条码号管理中十分的常见。
我记得当时解决这个问题 我写了一个较长的存储过程来完成的。
搂主 可以把你的用途(用来干什么将详细一点 以助于其他的朋友帮你写sql);
 
blackbook 你说的一点也不错,我也正在解决类似的问题.
如:A表 是领票据的连续编号1001---2000;
b表 就是票据核销的部分票据
下在就是要求得还有那些票据没有核销。
 
还有一点,可能数据量比较大,所以请各路高手,能用最佳的方法来实现这个问题
 
对于字符串的怎么来处理
 
老大,我也做过一个发票打印,从发票领取,入库,打印,核销,统计,搞的我是累死了,
怎么,你入库时不是解包入库成单张,然后好控制打印和核销吗?
 
因为量比较大,所以没有入库时没有解包成张
 
那你打印不是自己做的?,核销不是一张张核销?
 
你的做好不是很好,因为我的量很大,所以在考虑怎样来处理较为最佳
 
兄弟看看行不行

Select T1.b as bb , (select min(b) from T2)-1 as e
from T1
where b < (select min(b) from T2) -1

union

select (A.e+1) as b, (isnull(B.b,0)-1) as e
from t2 A left join T2 B on B.ID = A.ID +1
where A.e +1 < isnull(B.b,0)-1

union

select (select max(e) from T2)+1 as b, e
from T1
where (select max(e) from T2)+1 < e

 
对于字段AA,BB是字符型的,你可以用CONVERT函数进行转换,但是AA,BB里的数据必须是整型
的,我想我的那句SQL语句速度应该是可以的,不知道你试过没有,当然你可以看看自己进行优化。
 
谢谢大家,结贴
 
后退
顶部