2017-08-08 11 views
1

私は同様のデータを含むテーブルを持っています。SQLクエリ:2つの列で同様の値を確認

To From Rule 
01 02 E 
01 03 E 
01 04 E 
02 03 E 
02 01 E 
03 02 E 
04 01 E 

したがって、01-02は02-01と同じです。私はユニークなペアを持つクエリを記述したいと思います。 結果セットに01-02または02-01が含まれている必要があります。

私は多くの投稿を行っていますが、これを達成する方法を理解することはできません。 誰かがこの問題に直面した場合は、解決策を提案してください。期待

結果セットは:

To From Rule 
01 02 E 
01 03 E 
01 04 E 
02 03 E 

答えて

2

あなたが得たいと思っている正確な結果を簡単かつ簡単に返す。

SELECT * from 
(
    select 
(case when _to<_from then _to else null end) as _to, 
(case when _from>_to then _from else null end) as _from, 
_rule 
from _work 
) as [Stay_happy_:P] 
where 
_to is not null and _from is not null 

私はあなたのデータのテスト環境を作成し、クエリ上記を経由して、それを選択 - >here

1

何をする必要があるデータを正規化することです。 これを行う1つの方法は、より小さい値が常にFromになるようにFromとToを入れ替えることです。

次に、ROW_NUMBERウィンドウ関数を使用してグループを計算します。

問合せ:

SELECT * 
FROM 
    (SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY 
      -- If From is bigger than To than swap them 
      (CASE WHEN [To] < [From] THEN [To] ELSE [From] END), 
      (CASE WHEN [To] < [From] THEN [From] ELSE [To] END) ORDER BY NULL) AS PairNum 
    FROM [some table]) AS Groups 
WHERE PairNum = 1 

注: SQL Serverのバージョンを約ORDER BY NULLを不平を言うならば、例えば、いくつかの列名とNULLを置き換えますID

1

select [To],[From] from #temp_t where [To]<[From] 
union 
select [From],[To] from #temp_t where [From]<=[To] 
+0

[To] = [From] – Alex

+0

@Alexのシナリオに対応する必要がありますnclude条件[From] = [To] – Mat

0

は、このスクリプトを試してみてくださいあなたの問題を解決する別の方法を、

create table #t (id int identity(1,1),Tos varchar(10) not null 
,Froms varchar(10) not null,Rules varchar(10)) 


insert into #t VALUES 
('01','02','E'),('01','03','E') 
,('01','04','E'),('02','03','E') 
,('02','01','E'),('03','02','E') 
,('04','01','E') 

; 

WITH CTE 
AS (
    SELECT t.* 
     ,c.id id1 
    FROM #t t 
    CROSS APPLY (
     SELECT * 
     FROM #t c 
     WHERE c.id > t.id 
      AND c.tos = t.froms 
      AND c.Froms = t.Tos 
     ) c 
    ) 
    ,CTE1 
AS (
    SELECT t.* 
    FROM #t t 
    WHERE NOT EXISTS (
      SELECT * 
      FROM cte c 
      WHERE c.id = t.id 
       OR c.id1 = t.id 
      ) 
    ) 
SELECT tos 
    ,froms 
    ,rules 
FROM cte 

UNION ALL 

SELECT tos 
    ,froms 
    ,rules 
FROM cte1 

DROP TABLE #t 
関連する問題