表A                               表B          
  ID         书名         类型         书名        类型            时间
  1          三国         小说         三国        小说           2011-01-01
  2          水浒         小说         水浒        小说           2011-01-02
  3          萌芽         null         萌芽        刊物           2011-01-03
  4          柯南         漫画         三国        null           2011-01-04
  5          死神         漫画         null        漫画           2011-01-05表A ID 和书名 是唯一且 不能为空     表B 时间 不能为空 书名和类型 可以为空 但不能同时为空
要求:  当表B中 类型不为空时 以类型为连接  获取ID 并且时间为最新的 如 4 柯南  漫画 2011-01-05
 当类型为空时  以书名为连接 获取ID 并且时间为最新的   如  1  三国  2011-01-4

解决方案 »

  1.   


    select ID,书名,max(时间) 时间
    from(
    select ID,A.书名,A.类型,B.时间
    from A inner join B on (A.书名=B.书名 or A.类型=B.类型))t
    group by t.ID,t.书名
    order by t.ID
      

  2.   


    select *  from
    (     
         case when B.leixing is not null then  
             (select  A.ID,A.shuming,A.leixing,MAX(B.time) from A left join B 
                on A.leixing=B.leixing) 
        else
             (select A.ID,B.shuming,B.time from A left join B 
                on A.shuming=B.shuming )
         end
    )t
      

  3.   


    --上面明显错误,sorry
    --测试数据
    DECLARE @TA TABLE(ID int,shuming varchar(10),leixing  varchar(10))DECLARE @TB TABLE(shuming varchar(10),leixing varchar(10),time datetime)INSERT INTO @TA
    SELECT '1','三国','小说'UNION ALL
    SELECT '2','水浒','小说'UNION ALL
    SELECT '3','萌芽','null'UNION ALL
    SELECT '4','柯南','漫画'UNION ALL
    SELECT '5','死神','漫画'INSERT INTO @TB
    SELECT '三国','小说','2011-01-01'UNION ALL
    SELECT '水浒','小说','2011-01-02'UNION ALL
    SELECT '萌芽','刊物','2011-01-03'UNION ALL
    SELECT '三国','null','2011-01-04'UNION ALL
    SELECT 'null','漫画','2011-01-05'--查询
    select  A.ID,A.shuming,MAX(B.time) as B.time ,(case when B.leixing is not null then B.leixing else '' end) as B.leixing
    from @TA  A left join @TB B  on A.leixing=B.leixing 
    union all
    select A.ID,B.shuming,B.time,(case when B.leixing is  null then null else '' end) as B.leixing
     from @TA  A left join @TB  B on A.shuming=B.shuming 
      

  4.   

    --> 测试数据:[ta]
    IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
    GO
    CREATE TABLE [ta]([ID] INT,[shuming] VARCHAR(4),[leixing] VARCHAR(4))
    INSERT [ta]
    SELECT 1,'三国','小说' UNION ALL
    SELECT 2,'水浒','小说' UNION ALL
    SELECT 3,'萌芽',NULL UNION ALL
    SELECT 4,'柯南','漫画' UNION ALL
    SELECT 5,'死神','漫画'
    GO
    IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([shuming] VARCHAR(4),[leixing] VARCHAR(4),[time] DATETIME)
    INSERT [tb]
    SELECT '三国','小说','2011-01-01 00:00:00.000' UNION ALL
    SELECT '水浒','小说','2011-01-02 00:00:00.000' UNION ALL
    SELECT '萌芽','刊物','2011-01-03 00:00:00.000' UNION ALL
    SELECT '三国',NULL,'2011-01-04 00:00:00.000' UNION ALL
    SELECT NULL,'漫画','2011-01-05 00:00:00.000'
    GO--> 测试语句:
    SELECT a.id,a.shuming,a.leixing,b.time FROM [ta] as a join  [tb] as b
    on a.[shuming]=b.[shuming] where b.[leixing] is null
    union 
    SELECT a.id,a.shuming,a.leixing,b.time FROM [ta] as a join  [tb] as b
    on a.[leixing]=b.[leixing] where b.[shuming] is null
    /*
    id          shuming leixing time
    ----------- ------- ------- -----------------------
    1           三国      小说      2011-01-04 00:00:00.000
    4           柯南      漫画      2011-01-05 00:00:00.000
    5           死神      漫画      2011-01-05 00:00:00.000(3 行受影响)
    */
      

  5.   

    应该在加一个条件--> 测试语句:
    SELECT a.id,a.shuming,a.leixing,b.time FROM [ta] as a join  [tb] as b
    on a.[shuming]=b.[shuming] 
    where b.[leixing] is null
    and not exists (select 1 from [tb] where [shuming]=b.[shuming] and [time]>b.[time])
    union 
    SELECT a.id,a.shuming,a.leixing,b.time FROM [ta] as a join  [tb] as b
    on a.[leixing]=b.[leixing] 
    where b.[shuming] is null
    and not exists (select 1 from [tb] where [leixing]=b.[leixing] and [time]>b.[time])