日期:2014-05-17  浏览次数:20862 次

DataSet 过滤的问题
现在有如下数据集。

  MC A B LHBH LX 
仓库A<->仓库C 003 004 003004 1
仓库B<->仓库C 001 004 001004 1
仓库C<->仓库A 004 003 004003 2
仓库C<->仓库B 004 001 004001 2



比如说:“仓库A<->仓库C”和”仓库C<->仓库A “ 这两条记录,我只想保留其中一条记录。
请教下怎么才能过滤


------解决方案--------------------

那这个你就要提取一下MC里面的字符进行比对,你要把"仓库A<->仓库C”提取出来进行排序换成"仓库C<->仓库A"和第三条记录MC字段的值"仓库C<->仓库A"进行比较
再进行如下操作:
select * from a t
where not exists(select * from a where t.MC=MC and t.id<id)
如果MC里面的字符不进行排序,小弟不知道还能怎么解决。
期待更好的解决
------解决方案--------------------
如果LX是区分的话,下面这个可以参考
SQL code

--Create
CREATE TABLE tests(MC VARCHAR(20),A VARCHAR(20),B VARCHAR(20),LHBH VARCHAR(20),LX INT )
--insert
INSERT INTO tests
SELECT '仓库A<->仓库C','003','004','003004','1'
UNION ALL
SELECT '仓库B<->仓库C','001','004','001004','1'
UNION ALL
SELECT '仓库C<->仓库A','004','003','004003','2'
UNION ALL
SELECT '仓库C<->仓库B','004','001','004001','2'
UNION ALL
SELECT '仓库A<->仓库B','003','001','003001','2'
--select
SELECT * FROM tests
--Query
WITH t AS 
(SELECT t1.*,ROW_NUMBER() OVER (PARTITION BY t1.LX ORDER BY t1.LX) AS BH FROM tests t1
LEFT JOIN tests t2 ON t1.a=t2.b AND t1.b=t2.a
WHERE t2.a IS NOT NULL)
SELECT * FROM t WHERE bh =1
--drop
DROP TABLE tests

MC                   A                    B                    LHBH                 LX          BH
-------------------- -------------------- -------------------- -------------------- ----------- --------------------
仓库A<->仓库C            003                  004                  003004               1           1
仓库C<->仓库A            004                  003                  004003               2           1