首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

此SQL大亨晕,大家来瞧瞧

2012-12-18 
此SQL巨头晕,大家来瞧瞧本帖最后由 s63403048 于 2012-12-04 17:02:36 编辑select distinct (A.CARDID),A.

此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表中有多少条数据,就重复多少条。。


[其他解释]

引用:
不知道是什么意思,我那语句的结构改了下你试试看

select distinct (A.CARDID),
                A.CARDNO,
                A.MEMBERID,
                C.MEMBERNO,
                C.MemberName,
               ……


不好意思
没有说清楚.
主要需要修改的东西就是 
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
删除后.
就出现了居多重复数据
[其他解释]
引用:
A 表和 C 表没有连接条件。。。
结果是不是C表中有多少条数据,就重复多少条。。

恩对.
现在的版本是这个样子.
您瞧瞧我发的这个第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表的主键关联以下。。。或则其他的字段在业务上能保持唯一的一条记录也行。。
就不会出现重复数据。。。


[其他解释]
引用:
你改了这后的SQL 

h 表中查询出来的carid 居然在maseter表 c 中 对应不上 ?
是否需要用外连接。。。

没改之前的
SQL code?12345A.type = D.cardid      ----主建关联确定唯一的一条记录and A.cardid = E.cardid     --主建关联确定唯一的一条记录 and A.cardid =……



恩.
的确.
但是我像您说的 这样关联后.还是有好多重复数据.
当加上条件.
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




[其他解释]
引用:
SQL code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647select distinct (A.CARDID),                A.CARDNO,                A.MEMBERID,              ……




还是没东西啊.
呜呜.

[其他解释]
下班了。。。。。
[其他解释]
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 
[其他解释]
引用:
SQL code?123456789101112131415161718192021222324252627282930313233343536373839404142434445select distinct (A.CARDID),                A.CARDNO,                A.MEMBERID,                C.……



[其他解释]
 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注释部分的条件。。。。




[其他解释]
 '-' 
[其他解释]
引用:
引用:引用:SQL code?123456789101112131415161718192021222324252627282930313233343536373839404142434445select distinct (A.CARDID),                A.CARDNO,……

没这个意思.
只不过和我问的问题似乎没多大关联.
呵呵
[其他解释]
引用:
引用:SQL code?123456789101112131415161718192021222324252627282930313233343536373839404142434445select distinct (A.CARDID),                A.CARDNO,                A.MEMB……

你这是表示我说的不对吗?

热点排行