none
Sql 查询的问题 RRS feed

  • 问题

  • 环境:
    CREATE TABLE [dbo].[X](
        [T] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [I] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [A] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [K] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [S] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL
    )
    select * into dbo.Y from dbo.X where 1<>1;
    select * into dbo.Z from dbo.X where 1<>1;

    X表
    T              I     A     K      S
    09:08:02    Z    A    小华    N
    11:00:03    Z    A    小明    N
    12:00:04    Z    B    小张    N

    Y表
    T              I     A     K      S
    09:08:55    Z    A    -        Y
    12:11:11    Z    A    -        Y
    12:22:32    Z    A    -        N
    12:22:44    Z    B    -        N
    12:11:00    Z    A    小万    N
    15:00:22    Z    S    -        Y

    Z表
    T              I     A     K      S
    12:33:53    S    F    -       N

    目标是:找出所有的表中 K不为‘-’ 且此记录的I,A 与Y表中S字段为'Y'的I ,A的值一致,且此记录的T字段要小于Y表中S字段为'Y'的T字段,并且此记录的T字段最接近Y表中S字段为'Y'的T字段;
    有点绕,呵呵
    上面的测试数据要求查询出的结果为:
    09:08:02    Z    A    小华    N  --X表
    12:11:00    Z    A    小万    N  --Y表
    2009年10月16日 9:43

答案

  • 确实比较绕,呵呵。下面是我的代码,看下是不是你想要的

    use tempdb
    go
    
    --============= 搭建测试环境 =====================
    CREATE TABLE [dbo].[X](
        [T] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [I] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [A] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [K] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [S] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL
    )
    select * into dbo.Y from dbo.X where 1<>1;
    select * into dbo.Z from dbo.X where 1<>1;
    
    --X表
    insert into X
    select '09:08:02','Z','A','小华','N'
    union all select '11:00:03','Z','A','小明','N'
    union all select '12:00:04','Z','B','小张','N'
    
    --Y表
    insert into Y
    select '09:08:55','Z','A','-','Y'
    union all select '12:11:11','Z','A','-','Y'
    union all select '12:22:32','Z','A','-','N'
    union all select '12:22:44','Z','B','-','N'
    union all select '12:11:00','Z','A','小万','N'
    union all select '15:00:22','Z','S','-','Y'
    
    --Z表
    insert into Z
    select '12:33:53','S','F','-','N'
    
    
    --============= 逐步查询得到结果 =====================
    
    --Y表中S字段为'Y'的先放入临时表
    select I,A,T into #Y from Y where S='Y'
    
    --完成除了"最接近Y表T字段"以外的条件查询 
    select A.*, 
    		ABS( convert(int,replace(A.T,':',''))-convert(int,replace(B.T,':',''))) as 和Y表的T差额,
    		B.T as [Y-T]
    into #S
    from 
    (
    	select * from X where K<>'-'
    		union all
    	select * from Y where K<>'-'
    		union all
    	select * from Z where K<>'-'
    )A,	--1.所有的表中K不为‘-’
    	#Y as B  
    where A.I=B.I and A.A=B.A	--2.记录的I,A 与Y表中S字段为'Y'的I ,A的值一致
    	and A.T<B.T				--3.此记录的T字段要小于Y表中S字段为'Y'的T字段
    
    --加上 最接近Y表中S字段为'Y'的T字段 的条件   完成查询
    select *
    from #S
    where 和Y表的T差额 in 
    	(select min(和Y表的T差额) from #S group by [Y-T])
    
    --以下为结果
    /*
    	T           I   A    K      S   和Y表的T差额     Y-T
    	---------- --- ---- ----- ---- --------------- -------------
    	09:08:02	Z    A     小华   N	   53           09:08:55
    	12:11:00	Z    A     小万   N	   11           12:11:11
    */
    • 已标记为答案 steven_lsy 2009年10月19日 5:40
    2009年10月16日 16:21
    版主