【问题标题】:How can I get join not duplicate?我怎样才能加入不重复?
【发布时间】:2012-11-04 17:44:44
【问题描述】:

我加入了 2 个表,但使用了 3 个表。我不需要重复值。但我尝试加入有重复。

peopleAll:

pNo    pName
-------------
00001  Sang
00002  Janta
00003  Els
00004  Est
00005  Sam
00006  John
00007  Misan
00008  Wila
00009  light
00010  Smith
00011  Ritpo

fTime

cNo    cDate                     cIn                        cOut
-----------------------------------------------------------------------------------
00001  2012-10-22 00:00:00.000   2012-10-22 07:59:00.000    2012-10-22 20:34:00.000
00002  2012-10-22 00:00:00.000   2012-10-22 12:50:00.000    2012-10-22 19:50:00.000
00003  2012-10-22 00:00:00.000   2012-10-22 12:01:00.000    2012-10-22 20:30:00.000
00004  2012-10-22 00:00:00.000   2012-10-22 07:55:00.000    2012-10-22 20:30:00.000
00005  2012-10-22 00:00:00.000   2012-10-22 07:27:00.000    2012-10-22 20:31:00.000
00010  2012-10-22 00:00:00.000   2012-10-22 07:12:00.000    2012-10-22 20:22:00.000

Leave

lNo    lDate                     lStart                     lStop
-----------------------------------------------------------------------------------
00002  2012-10-22 00:00:00.000   2012-10-22 08:00:00.000    2012-10-22 12:00:00.000
00003  2012-10-22 00:00:00.000   2012-10-22 08:00:00.000    2012-10-22 12:00:00.000
00011  2012-10-22 00:00:00.000   NULL                       NULL

此 SQL 代码:

SELECT lr.lNo, lr.lDate, lr.lStart, lr.lStop 
FROM Leave lr 
Where lr.cStart = '2012-10-22'

UNION ALL

SELECT pa.pNo, ISNULL(tf.cDate, Convert(nvarchar(10),'2012-10-22',114)),tf.cIn, tf.cOut
FROM fTime tf FULL OUTER join peopleAll pa On tf.cNo = pa.pNo AND 
tf.cDate = Convert(nvarchar(10),'2012-10-22',114)

返回这个输出:

lNo    lDate                     lStart                     lStop
-----------------------------------------------------------------------------------
00001  2012-10-22 00:00:00.000   2012-10-22 07:59:00.000    2012-10-22 20:34:00.000
00002  2012-10-22 00:00:00.000   2012-10-22 08:00:00.000    2012-10-22 12:00:00.000
00002  2012-10-22 00:00:00.000   2012-10-22 12:50:00.000    2012-10-22 19:50:00.000
00003  2012-10-22 00:00:00.000   2012-10-22 08:00:00.000    2012-10-22 12:00:00.000
00003  2012-10-22 00:00:00.000   2012-10-22 12:01:00.000    2012-10-22 20:30:00.000
00004  2012-10-22 00:00:00.000   2012-10-22 07:55:00.000    2012-10-22 20:30:00.000
00005  2012-10-22 00:00:00.000   2012-10-22 07:27:00.000    2012-10-22 20:31:00.000
00006  2012-10-22 00:00:00.000   NULL                       NULL
00007  2012-10-22 00:00:00.000   NULL                       NULL
00008  2012-10-22 00:00:00.000   NULL                       NULL
00009  2012-10-22 00:00:00.000   NULL                       NULL
00010  2012-10-22 00:00:00.000   2012-10-22 07:12:00.000    2012-10-22 20:22:00.000
00011  2012-10-22 00:00:00.000   NULL                       NULL

我尝试更改 FULL OUTER JOIN 然后 LEFT OUTER JOIN 并得到输出:

lNo    lDate                     lStart                     lStop
-----------------------------------------------------------------------------------
00002  2012-10-22 00:00:00.000   2012-10-22 08:00:00.000    2012-10-22 12:00:00.000
00002  2012-10-22 00:00:00.000   2012-10-22 12:50:00.000    2012-10-22 19:50:00.000
00003  2012-10-22 00:00:00.000   2012-10-22 08:00:00.000    2012-10-22 12:00:00.000
00003  2012-10-22 00:00:00.000   2012-10-22 12:01:00.000    2012-10-22 20:30:00.000
00004  2012-10-22 00:00:00.000   2012-10-22 07:55:00.000    2012-10-22 20:30:00.000
00007  2012-10-22 00:00:00.000   NULL                       NULL
00008  2012-10-22 00:00:00.000   NULL                       NULL
00010  2012-10-22 00:00:00.000   2012-10-22 07:12:00.000    2012-10-22 20:22:00.000
00011  2012-10-22 00:00:00.000   NULL                       NULL

LEFT OUTER join 错过了一些字段??

我需要这个输出:

lNo    lDate                     lStart                     lStop
-----------------------------------------------------------------------------------
00001  2012-10-22 00:00:00.000   2012-10-22 07:59:00.000    2012-10-22 20:34:00.000
00002  2012-10-22 00:00:00.000   2012-10-22 12:50:00.000    2012-10-22 19:50:00.000 
00003  2012-10-22 00:00:00.000   2012-10-22 12:01:00.000    2012-10-22 20:30:00.000
00004  2012-10-22 00:00:00.000   2012-10-22 07:55:00.000    2012-10-22 20:30:00.000
00005  2012-10-22 00:00:00.000   2012-10-22 07:27:00.000    2012-10-22 20:31:00.000
00006  2012-10-22 00:00:00.000   NULL                       NULL
00007  2012-10-22 00:00:00.000   NULL                       NULL
00008  2012-10-22 00:00:00.000   NULL                       NULL
00009  2012-10-22 00:00:00.000   NULL                       NULL
00010  2012-10-22 00:00:00.000   2012-10-22 07:12:00.000    2012-10-22 20:22:00.000
00011  2012-10-22 00:00:00.000   NULL                       NULL

(00002,00003 from fTime)

请帮助我。谢谢你的时间。 :)

【问题讨论】:

    标签: sql sql-server join left-join outer-join


    【解决方案1】:
    Select p.pNo
    ,Coalesce(l.cDate,t.lDate,'2012-10-22') as ldate
    ,Coalesce(l.lStart,t.cIn) as lstart
    ,Coalesce(l.lStop,t.cOut  ) as lstop
    from peopleall p
    left join leave l on l.lNo=p.Pno and l.ldate='2012-10-22'
    left join fTime t on t.tNo=p.Pno and t.cDate='2012-10-22'
    

    【讨论】:

      【解决方案2】:

      试试这个

      Select p.pNo , 
      Coalesce(l.lDate , ftemp.cDate , NULL) as lDate , 
      Coalesce(l.lStart,ftemp.cIn , NULL)  as lStart ,
      Coalesce(l.lStop , ftemp.cOut, NULL ) as lStop 
      from peopleAll p  
      left join Leave l  on (p.pNo = l.lNo ) 
      left join 
        (select cNo, cDate ,cIn, cOut 
           from  fTime ft where not exists (select 1 from Leave l2 
                                            where ft.cNo = l2.lNo )) 
           ftemp
      on (ftemp.cNo = p.pNo ) 
      

      如果您遇到错误,可以将输出发送给我吗?

      【讨论】:

      • 试用后输出 lNo lDate lStart lStop 00001 2012-10-21 00:00:00.000 2012-10-21 07:00:00.000 2012-10-21 19:00:00.000 00001 2012 -10-23 00:00:00.000 2012-10-23 08:00:00.000 2012-10-23 20:00:00.000 00002 2012-10-22 00:00:00.000 2012-10-22 12:50:00.000 2012-10-22 19:50:00.000 00003 2012-10-22 00:00:00.000 2012-10-22 08:00:00.000 2012-10-22 12:00:00.000 00003 2012-10-22 00:00 :00.000 2012-10-22 12:01:00.000 2012-10-22 20:30:00.000 ..... ..... 它是重复值。
      • 如果发送结果会不会太过分: select cNo, cDate ,cIn, cOut from fTime ft where not exists (select 1 from Leave l2 where ft.cNo = l2.lNo ) ? ?
      猜你喜欢
      • 2018-07-15
      • 1970-01-01
      • 2018-11-25
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2021-07-16
      • 2017-08-15
      相关资源
      最近更新 更多