none
SQL字段筛选。 RRS feed

  • 问题

  • 有一个表名为test。

    字段1          字段2

    a1              b1

    a1              b2

    a1              b3

    a1              b4

    a1              b5

    a2              b3

    a3              b1

    a3              b3

    想要的结果是比如a3 的字段2只有两个值b1,b3

                           a2  只有个一个b3

    希望能够获得a3,所缺的b2,b4,b5

                     a2,所缺的b1,b2,b4,b5



    • 已编辑 彭123 2011年12月16日 1:06
    2011年12月15日 14:32

答案

  • 看來你的SQL SERVE是2005版,請問你有依照下列的T-SQL敘述去測試嗎?

    declare @t table (col1 varchar(10), col2 varchar(10))
    
    declare @col1 varchar(10)
    set @col1 = 'a3'
    
    insert into @t values ('a1','b1')
    insert into @t values ('a1','b2')
    insert into @t values ('a1','b3')
    insert into @t values ('a1','b4')
    insert into @t values ('a1','b5')
    insert into @t values ('a2','b3')
    insert into @t values ('a3','b1')
    insert into @t values ('a3','b3')
    
    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    
    --利用except找出字段1所缺少的字段2
    select distinct col2
    from @t
    except
    select col2
    from @t
    where col1 = @col1
    


    下圖為上述T-SQL的執行結果,確實可以找出b2,b4,b5,你要不要再重新測試看看。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 彭123 2011年12月16日 3:21
    2011年12月16日 2:04
  • 有人给了一个解决办法。

    declare @t table
    (col1 varchar(10),
     col2 varchar(10))

    declare @col1 varchar(10)
    set @col1 = 'a3'

    insert into @t values ('a1','b1')
    insert into @t values ('a1','b2')
    insert into @t values ('a1','b3')
    insert into @t values ('a1','b4')
    insert into @t values ('a1','b5')
    insert into @t values ('a2','b3')
    insert into @t values ('a3','b1')
    insert into @t values ('a3','b3')

    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    SELECT DISTINCT col1, col2
    FROM (SELECT col1, col2
            FROM (SELECT col1
                    FROM @t) AS A CROSS JOIN
                      (SELECT DISTINCT col2
                     FROM @t) AS B) C
    WHERE (NOT EXISTS
              (SELECT col1, col2
             FROM @t AS D
             WHERE D.col1 = C.col1 AND D.col2 = C.col2))

    • 已建议为答案 TerryChuang 2011年12月16日 3:11
    • 已标记为答案 彭123 2011年12月16日 3:21
    2011年12月16日 3:07

全部回复

  • 试试这个:

    WITH BasicTable
    AS 
    (
    SELECT COLB FROM Test WHERE ColA = 'A1'
    )
    
    
    SELECT AllRecords.ColA, AllRecords.ColB FROM
    (
    SELECT Distinct B.*, T.ColA  FROM BasicTable B
    
    CROSS JOIN test T
    
    )  AS AllRecords
    
    WHERE AllRecords.ColA + AllRecords.ColB NOT IN (SELECT ColA + ColB FROM test )
    
    ORDER BY AllRecords.ColA  


     

    2011年12月15日 17:29
    版主
  • 发生错误

    消息 207,级别 16,状态 1,第 6 行
    列名 'ColA' 无效。
    消息 207,级别 16,状态 1,第 6 行
    列名 'COLB' 无效。

    如果加了USE TEST2    “TEST2”是数据库名。

    消息 319,级别 15,状态 1,第 3 行
    关键字 'with' 附近有语法错误。如果此语句是公用表表达式或 xmlnamespaces 子句,那么前一个语句必须以分号结尾。

    2011年12月16日 0:41
  • --USE TEST2

    WITH BasicTable
    AS
    (
    SELECT 字段2 FROM Test WHERE 字段1 = 'A1'
    )


    SELECT AllRecords.字段1, AllRecords.字段2 FROM
    (
    SELECT Distinct B.*, T.字段1  FROM BasicTable B

    CROSS JOIN test T

    )  AS AllRecords

    WHERE AllRecords.字段1 + AllRecords.字段2 NOT IN (SELECT 字段1 + 字段2 FROM test )

    ORDER BY AllRecords.字段1 

    改成这样结果就为空。

     

     

    2011年12月16日 0:44
  • 依照你提供的SAMPLE,a2所缺的應該是b1、b2、b4和b5,試試看下列的T-SQL:

    declare @t table
    (col1 varchar(10),
     col2 varchar(10))
    
    declare @col1 varchar(10) = 'a2'
    
    insert into @t values ('a1','b1'),('a1','b2'),('a1','b3'),('a1','b4'),('a1','b5'),('a2','b3'),('a3','b1'),('a3','b3')
    
    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    
    --利用except找出字段1所缺少的字段2
    select distinct col2
    from @t
    except
    select col2
    from @t
    where col1 = @col1
    
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年12月16日 0:57
  • 依照你提供的SAMPLE,a2所缺的應該是b1、b2、b4和b5,試試看下列的T-SQL:

     

    declare @t table
    (col1 varchar(10),
     col2 varchar(10))
    
    declare @col1 varchar(10) = 'a2'
    
    insert into @t values ('a1','b1'),('a1','b2'),('a1','b3'),('a1','b4'),('a1','b5'),('a2','b3'),('a3','b1'),('a3','b3')
    
    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    
    --利用except找出字段1所缺少的字段2
    select distinct col2
    from @t
    except
    select col2
    from @t
    where col1 = @col1
    
    


     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    你好,依照你的代码,结果产生如下错误:

    消息 139,级别 15,状态 1,第 0 行
    不能向局部变量赋予默认值。
    消息 102,级别 15,状态 1,第 7 行
    ',' 附近有语法错误。
    消息 137,级别 15,状态 2,第 11 行
    必须声明标量变量 "@col1"。
    消息 137,级别 15,状态 2,第 19 行
    必须声明标量变量 "@col1"。


    而且好像只能筛选a2所缺的值,a3就被放弃了。
    • 已编辑 彭123 2011年12月16日 1:29
    2011年12月16日 1:21
  • 請問你的SQL SERVER版本是?
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年12月16日 1:35
  • 試試看下列的語法:

    declare @t table
    (col1 varchar(10),
     col2 varchar(10))
    
    declare @col1 varchar(10)
    set @col1 = 'a2'
    
    insert into @t values ('a1','b1')
    insert into @t values ('a1','b2')
    insert into @t values ('a1','b3')
    insert into @t values ('a1','b4')
    insert into @t values ('a1','b5')
    insert into @t values ('a2','b3')
    insert into @t values ('a3','b1')
    insert into @t values ('a3','b3')
    
    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    
    --利用except找出字段1所缺少的字段2
    select distinct col2
    from @t
    except
    select col2
    from @t
    where col1 = @col1
    



    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年12月16日 1:37
  • 請問你的SQL SERVER版本是?
    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    Microsoft SQL Server Management Studio 9.00.1399.00
    Microsoft Analysis Services 客户端工具 2005.090.1399.00
    Microsoft 数据访问组件 (MDAC) 6.0.6002.18005 (lh_sp2rtm.090410-1830)
    Microsoft MSXML 3.0 5.0 6.0
    Microsoft Internet Explorer 9.0.8112.16421
    Microsoft .NET Framework 2.0.50727.4216
    操作系统 6.0.6002
    2011年12月16日 1:45
  • 試試看下列的語法:

     

    declare @t table
    (col1 varchar(10),
     col2 varchar(10))
    
    declare @col1 varchar(10)
    set @col1 = 'a2'
    
    insert into @t values ('a1','b1')
    insert into @t values ('a1','b2')
    insert into @t values ('a1','b3')
    insert into @t values ('a1','b4')
    insert into @t values ('a1','b5')
    insert into @t values ('a2','b3')
    insert into @t values ('a3','b1')
    insert into @t values ('a3','b3')
    
    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    
    --利用except找出字段1所缺少的字段2
    select distinct col2
    from @t
    except
    select col2
    from @t
    where col1 = @col1
    


     


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    现在能够查到a2所缺的b1,b2,b4,b5。

    但是a3所缺的b2,b4,b5 就被放弃了。

    请问这个有什么好办法吗?

    2011年12月16日 1:49
  • 看來你的SQL SERVE是2005版,請問你有依照下列的T-SQL敘述去測試嗎?

    declare @t table (col1 varchar(10), col2 varchar(10))
    
    declare @col1 varchar(10)
    set @col1 = 'a3'
    
    insert into @t values ('a1','b1')
    insert into @t values ('a1','b2')
    insert into @t values ('a1','b3')
    insert into @t values ('a1','b4')
    insert into @t values ('a1','b5')
    insert into @t values ('a2','b3')
    insert into @t values ('a3','b1')
    insert into @t values ('a3','b3')
    
    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    
    --利用except找出字段1所缺少的字段2
    select distinct col2
    from @t
    except
    select col2
    from @t
    where col1 = @col1
    


    下圖為上述T-SQL的執行結果,確實可以找出b2,b4,b5,你要不要再重新測試看看。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 彭123 2011年12月16日 3:21
    2011年12月16日 2:04
  • 看來你的SQL SERVE是2005版,請問你有依照下列的T-SQL敘述去測試嗎?

     

    declare @t table (col1 varchar(10), col2 varchar(10))
    
    declare @col1 varchar(10)
    set @col1 = 'a3'
    
    insert into @t values ('a1','b1')
    insert into @t values ('a1','b2')
    insert into @t values ('a1','b3')
    insert into @t values ('a1','b4')
    insert into @t values ('a1','b5')
    insert into @t values ('a2','b3')
    insert into @t values ('a3','b1')
    insert into @t values ('a3','b3')
    
    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    
    --利用except找出字段1所缺少的字段2
    select distinct col2
    from @t
    except
    select col2
    from @t
    where col1 = @col1
    

     


    下圖為上述T-SQL的執行結果,確實可以找出b2,b4,b5,你要不要再重新測試看看。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    哦,可能我没有描述清楚。我想一次把缺失的都查出来。而不是每次都要去改变量。

    就是说我想一次就显示,a2所缺的b1,b2,b4,b5。

                                     a3所缺的b2,b4,b5 。

    都显示出来。

    • 已标记为答案 彭123 2011年12月16日 3:09
    • 取消答案标记 彭123 2011年12月16日 3:21
    2011年12月16日 2:07
  • 有人给了一个解决办法。

    declare @t table
    (col1 varchar(10),
     col2 varchar(10))

    declare @col1 varchar(10)
    set @col1 = 'a3'

    insert into @t values ('a1','b1')
    insert into @t values ('a1','b2')
    insert into @t values ('a1','b3')
    insert into @t values ('a1','b4')
    insert into @t values ('a1','b5')
    insert into @t values ('a2','b3')
    insert into @t values ('a3','b1')
    insert into @t values ('a3','b3')

    --依照字段1所篩選的字段2
    select * from @t
    where col1 = @col1
    SELECT DISTINCT col1, col2
    FROM (SELECT col1, col2
            FROM (SELECT col1
                    FROM @t) AS A CROSS JOIN
                      (SELECT DISTINCT col2
                     FROM @t) AS B) C
    WHERE (NOT EXISTS
              (SELECT col1, col2
             FROM @t AS D
             WHERE D.col1 = C.col1 AND D.col2 = C.col2))

    • 已建议为答案 TerryChuang 2011年12月16日 3:11
    • 已标记为答案 彭123 2011年12月16日 3:21
    2011年12月16日 3:07