此SQL巨头晕,大家来瞧瞧
本帖最后由 s63403048 于 2012-12-04 17:02:36 编辑
select distinct (A.CARDID),
A.CARDNO,
A.MEMBERID,
C.MEMBERNO,
C.MemberName,
C.IDNO,
D.cardName,
A.KEEPAMT,
C.Point,
C.STATUS,
A.AMT,
A.TOTAMT,
A.CONSUMAMT,
A.TICKETAMT,
A.CREATEDATE,
A.LASTMODIDATE,
A.VALIDDATE,
A.CARDPROP
from BasCardInfo A
left join BasMemberInfo C
on A.MEMBERID = C.MEMBERID, CardType D,
(select BranCode, cardid, trunc(saledate) as etrunc
from PosItemH
where saledate between to_date('2004-12-01', 'yyyy-mm-dd') and
to_date('2012-12-04', 'yyyy-mm-dd')
and abs(amt) >= 1) E,
(select trunc(saledate) as ftrunc, BranCode, cardid, count(1)
from PosItemH
where trunc(saledate) between to_date('2004-12-01', 'yyyy-mm-dd') and
to_date('2012-12-04', 'yyyy-mm-dd')
group by trunc(saledate), cardid, brancode
having 1 = 1 and count(1) > 1 and brancode in (select BranCode
from BasBranInfo
start with BranCode = '00'
connect by prior
BranCode =
PBranCode)) F
where A.type = D.cardid
and A.cardid = E.cardid
and A.cardid = F.cardid
and A.CARDNO = '80114141'
and C.memberid =
(select memberid from bascardinfo a where a.cardno = '80114141')
and e.etrunc = f.ftrunc
order by A.CardNO
如题...
分分大把的
[最优解释]
'-'
[其他解释]
现在出现的问题就是笛卡尔集了.
无限执行 直到卡死
[其他解释]
不知道是什么意思,我那语句的结构改了下你试试看
select distinct (A.CARDID),
A.CARDNO,
A.MEMBERID,
C.MEMBERNO,
C.MemberName,
C.IDNO,
D.cardName,
A.KEEPAMT,
C.Point,
C.STATUS,
A.AMT,
A.TOTAMT,
A.CONSUMAMT,
A.TICKETAMT,
A.CREATEDATE,
A.LASTMODIDATE,
A.VALIDDATE,
A.CARDPROP
from (select * from BasCardInfo where A.CARDNO = '80114141' ) A
left join (select *
from BasMemberInfo where memberid =(select memberid from bascardinfo a where a.cardno = '80114141')
) C on A.MEMBERID = C.MEMBERID,
inner join CardType D on A.type = D.cardid
inner join(select e.BranCode BranCodew,e.cardid,e.etrunc,f.BranCode BranCodef,f.counts
from
(select BranCode, cardid, trunc(saledate) as etrunc
from PosItemH
where saledate between to_date('2004-12-01', 'yyyy-mm-dd') and
to_date('2012-12-04', 'yyyy-mm-dd')and abs(amt) >= 1
) E
inner join
( select trunc(saledate) as ftrunc, BranCode, cardid, count(1) counts
from PosItemH
where trunc(saledate) between to_date('2004-12-01', 'yyyy-mm-dd') and
to_date('2012-12-04', 'yyyy-mm-dd')
and brancode in (select BranCode
from BasBranInfo
start with BranCode = '00'
connect by prior BranCode =PBranCode
)
group by trunc(saledate), cardid, brancode
having count(1) > 1
) F on e.etrunc = f.ftrunc and e.cardid=f.cardid) w
on A.cardid = w.cardid
order by A.CardNO
[其他解释]
A 表和 C 表没有连接条件。。。
结果是不是C表中有多少条数据,就重复多少条。。
[其他解释]
不好意思
没有说清楚.
主要需要修改的东西就是
from BasCardInfo A
left join BasMemberInfo C
这2张表不能关联..
需要取消关联.
我自己修改了一下.
简洁版本的.
您瞧瞧.
此语句按要求.但是查不出东西
select c.CardID,
m.memberno,
c.CardNO,
m.MemberName,
c.brancode
[其他解释]
'-'
[其他解释]
b.branname bran,
m.IDNO,
tp.cardname,
c.Status,
m.point
from basmemberinfo m, basbraninfo b, bascardinfo c, cardtype tp,
(select *
from ( select f.cardid, f.brancode,count(f.cardid)
countall,sum(point) sumall from accountpoint f
where BranCode like '%00%'
and CDate >= to_date('2004-12-01', 'yyyy-mm-dd')
and CDate < to_date('2012-12-03', 'yyyy-mm-dd') + 1
group by f.cardid, f.brancode) h
where 1 = 1
and countall > 1
and sumall > 1 ) h where
m.memberid = c.memberid
and c.type = tp.cardid
and c.brancode = b.brancode
and c.cardid = h.cardid
and c.memberid =
(select memberid from bascardinfo a where a.cardno = '80106069')
order by c.cardno
当把
and c.cardid = h.cardid
删除后.
就出现了居多重复数据
[其他解释]
恩对.
现在的版本是这个样子.
您瞧瞧我发的这个第3个版本的SQL.
麻烦了.
[其他解释]
你改了这后的SQL
h 表中查询出来的carid 居然在maseter表 c 中 对应不上 ?
是否需要用外连接。。。
没改之前的
A.type = D.cardid ----主建关联确定唯一的一条记录
and A.cardid = E.cardid --主建关联确定唯一的一条记录
and A.cardid = F.cardid -- 主建关联确定唯一的一条记录and A.CARDNO = '80114141'
and C.memberid =
(select memberid from bascardinfo a where a.cardno = '80114141') and e.etrunc = f.ftrunc
而你的C表和A表
是用 on A.MEMBERID = C.MEMBERID 这个关联
这句话的关系是多对多的关系。。
也就是说。。可能A中MEMBERID =1 的MEMBERID 在C中有 2条或多条记录的MEMBERID = 1
不能保证确定唯一的记录。。会出现很多重复数据
你只要把A表和C表的主键关联以下。。。或则其他的字段在业务上能保持唯一的一条记录也行。。
就不会出现重复数据。。。
[其他解释]
恩.
的确.
但是我像您说的 这样关联后.还是有好多重复数据.
当加上条件.
cardno 后 就无数据了..
[其他解释]
解决了吗?结贴给分吧
[其他解释]
木有啊.
请看小弟最新回复
[其他解释]
恩.
的确.
但是我像您说的 这样关联后.还是有好多重复数据.
当加上条件.
cardno 后 就无数据了..
select c.CardID,
m.memberno,
c.CardNO,
m.MemberName,
c.brancode
[其他解释]
b.branname bran,
m.IDNO,
tp.cardname,
c.Status,
m.point
from basmemberinfo m, basbraninfo b, bascardinfo c, cardtype tp,
(select *
from ( select f.cardid, f.brancode,count(f.cardid)
countall,sum(point) sumall from accountpoint f
where BranCode like '%00%'
and CDate >= to_date('2004-12-01', 'yyyy-mm-dd')
and CDate < to_date('2012-12-03', 'yyyy-mm-dd') + 1
group by f.cardid, f.brancode) h
where 1 = 1
and countall > 1
and sumall > 1 ) h where
m.memberid = c.memberid
and c.type = tp.cardid
and c.brancode = b.brancode
and c.cardid = m.cardid
and c.CARDNO = '80114141'
and c.memberid =
(select memberid from bascardinfo a where a.cardno = '80106069')
order by c.cardno
[其他解释]
cardno 加在外连接上了吗?
[其他解释]
select distinct (A.CARDID),
A.CARDNO,
A.MEMBERID,
C.MEMBERNO,
C.MemberName,
C.IDNO,
D.cardName,
A.KEEPAMT,
C.Point,
C.STATUS,
A.AMT,
A.TOTAMT,
A.CONSUMAMT,
A.TICKETAMT,
A.CREATEDATE,
A.LASTMODIDATE,
A.VALIDDATE,
A.CARDPROP
from BasCardInfo A
left join BasMemberInfo C
on A.MEMBERID = C.MEMBERID
and A.cardno= C.cardno -- 加这儿。。或者你懂得。。
, CardType D,
(select BranCode, cardid, trunc(saledate) as etrunc
from PosItemH
where saledate between to_date('2004-12-01', 'yyyy-mm-dd') and
to_date('2012-12-04', 'yyyy-mm-dd')
and abs(amt) >= 1) E,
(select trunc(saledate) as ftrunc, BranCode, cardid, count(1)
from PosItemH
where trunc(saledate) between to_date('2004-12-01', 'yyyy-mm-dd') and
to_date('2012-12-04', 'yyyy-mm-dd')
group by trunc(saledate), cardid, brancode
having 1 = 1 and count(1) > 1 and brancode in (select BranCode
from BasBranInfo
start with BranCode = '00'
connect by prior
BranCode =
PBranCode)) F
where A.type = D.cardid
and A.cardid = E.cardid
and A.cardid = F.cardid
and A.CARDNO = '80114141'
and C.memberid =
(select memberid from bascardinfo a where a.cardno = '80114141')
and e.etrunc = f.ftrunc
order by A.CardNO
[其他解释]
还是没东西啊.
呜呜.
[其他解释]
下班了。。。。。
[其他解释]
select distinct (A.CARDID),
A.CARDNO,
A.MEMBERID,
C.MEMBERNO,
C.MemberName,
C.IDNO,
D.cardName,
A.KEEPAMT,
C.Point,
C.STATUS,
A.AMT,
A.TOTAMT,
A.CONSUMAMT,
A.TICKETAMT,
A.CREATEDATE,
A.LASTMODIDATE,
A.VALIDDATE,
A.CARDPROP
from BasCardInfo A
left join BasMemberInfo C
on A.MEMBERID = C.MEMBERID, CardType D,
(select BranCode, cardid, trunc(saledate) as etrunc
from PosItemH
where saledate between to_date('2004-12-01', 'yyyy-mm-dd') and
to_date('2012-12-04', 'yyyy-mm-dd')
and abs(amt) >= 1) E,
(select trunc(saledate) as ftrunc, BranCode, cardid, count(1)
from PosItemH
where trunc(saledate) between to_date('2004-12-01', 'yyyy-mm-dd') and
to_date('2012-12-04', 'yyyy-mm-dd')
group by trunc(saledate), cardid, brancode
having 1 = 1 and count(1) > 1 and brancode in (select BranCode
from BasBranInfo
start with BranCode = '00'
connect by prior
BranCode =
PBranCode)) F
where A.type = D.cardid
and A.cardid = E.cardid
and A.cardid = F.cardid
and A.CARDNO = '80114141'
and C.memberid =
(select memberid from bascardinfo a where a.cardno = '80114141')
and e.etrunc = f.ftrunc
order by A.CardNO
LZ 这个Distinct是作用了所有字段的,不仅仅是(A.CARDID),加括号也没用
[其他解释]
额
88
[其他解释]
楼主。。。你可以调试你的sql。。看看到底是哪个条件为false,导致查不出数据。。然后分析原因
你可以这样。。
select
/*c.CardID,
m.memberno,
c.CardNO,
m.MemberName,
c.brancode
[其他解释]
额
[其他解释]
b.branname bran,
m.IDNO,
tp.cardname,
c.Status,
m.point */
*
from basmemberinfo m, basbraninfo b, bascardinfo c, cardtype tp,
(select *
from ( select f.cardid, f.brancode,count(f.cardid)
countall,sum(point) sumall from accountpoint f
where BranCode like '%00%'
and CDate >= to_date('2004-12-01', 'yyyy-mm-dd')
and CDate < to_date('2012-12-03', 'yyyy-mm-dd') + 1
group by f.cardid, f.brancode) h
where 1 = 1
and countall > 1
and sumall > 1 ) h
where
m.memberid = c.memberid
-- and c.type = tp.cardid
-- and c.brancode = b.brancode
-- and c.cardid = h.cardid
-- and c.memberid =
-- (select memberid from bascardinfo a where a.cardno = '80106069')
order by c.cardno
然后逐步打开where注释部分的条件。。。。
[其他解释]
'-'
[其他解释]
没这个意思.
只不过和我问的问题似乎没多大关联.
呵呵
[其他解释]
你这是表示我说的不对吗?