2017-10-10 19 views
2

私には、妻と妻の夫婦関係が含まれているテーブルがあります。 テーブルにはそれぞれのrealtion用の2つの行が含まれています(BTW、性別は意味がありません。夫と妻のことができます)。私の予想結果は、グループごとに1つだけの関係を持つことですグループ化されたオブジェクトの1行を取得

Id1 | Id2 | ConnectiondID | RelatedConnectionId 
----------------------------------------------------- 
123 | 333 | FF45  |  F421 
333 | 123 | F421  |  FF45 
456 | 987 | F333  |  F321 
987 | 456 | F321  |  F333 

Wife--Husbandと\または Husband--Wife 表は次のようになります。意味は、表には、「接続」のための2つの行の結果が表示される場合があります
Id1 | Id2 
---------- 
123 | 333 
456 | 987 
+0

サンプルデータには大きな関係があります。したがって、私はその質問を理解していない。 –

+0

2番目の行のID2が123を指していないはずですか?そうでない場合は、期待どおりの結果に戻すID番号をどのように決定するのですか?私にとって、データは、123人が結婚して333人、結婚した人が222人(123人ではない)ということを意味します。 – SchmitzIT

+0

ごめんなさい。データミス –

答えて

1

これは、あなただけのカップルやごID値が関数やグループ化、すべてのユニークな数値であり、任意の自己が参加する必要はありませんしたいと仮定すると、実際には非常に簡単です:

declare @t table(Id1 int,Id2 int,ConnectiondID nvarchar(5),RelatedConnectionId nvarchar(5)); 
insert into @t values(123,333,'FF45','F421'),(333,123,'F421','FF45'),(456,444,'FF46','F422'),(444,456,'F422','FF46'),(789,555,'FF47','F423'),(555,789,'F423','FF47'); 

select * 
from @t 
where Id1 < Id2 
order by Id1 

出力:

例えば
+-----+-----+---------------+---------------------+ 
| Id1 | Id2 | ConnectiondID | RelatedConnectionId | 
+-----+-----+---------------+---------------------+ 
| 123 | 333 | FF45   | F421    | 
| 444 | 456 | F422   | FF46    | 
| 555 | 789 | F423   | FF47    | 
+-----+-----+---------------+---------------------+ 
+0

列の1つがNULLの場合はどうすればよいですか?私はisnull()メソッドを使うべきですか? –

+0

@ YanivEliavこれは、あなたのヌル値が意味するものと、あなたがそれらを見ている場所に依存します。たとえば、 'ID1'カラムに常に値がある場合、' where'節に 'または' ID2 is null'を追加するだけです。 – iamdave

+0

ありがとう。それは –

0

私が正しくあなたの質問を理解していた場合は、テーブルなどの上に、自己結合を実行する必要がありますON t1.id1 = t2.id2またはON t1.ConnectionId = t2.RelatedConnectionIDと明らかに、これは両方の方法で結合しています。ただ一つの方法のいずれかの値よりも小さいか他方よりも大きくなるように結合述語に条件を追加するには、このを制限するために

。例えば

DECLARE @tbl table(Id1 smallint PRIMARY KEY, Id2 smallint,ConnectiondID char(5),RelatedConnectionId char(5)); 
INSERT @tbl(Id1,Id2,ConnectiondID,RelatedConnectionId) 
VALUES(123,333,'FF45','F421'), 
     (333,123,'F421','FF45'), 
     (456,222,'FF45','F421'), 
     (222,456,'F421','FF45'), 
     (789,111,'FF45','F421'), 
     (111,789,'F421','FF45'); 

SELECT * 
FROM @tbl t1 
JOIN @tbl t2 ON t2.Id1 = t1.Id2 AND t2.Id1 > t1.Id1; 
+0

「ID」の値が他のものよりも多いか少ないかを判断するために自己結合を使う必要はありません。 – iamdave

+0

@iamdave - 自己結合がすでに存在する単一の行にフィルタするために、1つの値が他の値よりも小さい場合、自己結合は機能しません。その他の理由により必要となる。 – SQLBadPanda

+0

あなたは、自己結合が必要ではないという私の意見が不足しています。ここでチェックする必要があるのは、一組の 'ID'値が返され、他のものは返されないという条件です。どちらも数値であるため、一方が他方よりも小さい場所で単純にフィルタリングすると、目的のデータセットが返されます。 – iamdave

0

DECLARE @T TABLE (id1 int, id2 int,ConnectiondID varchar(5),RelatedConnectionId varchar(5)) 
INSERT INTO @T (Id1,Id2,ConnectiondID,RelatedConnectionId) 
VALUES 
(123 , 333 ,'FF45','F421'), 
(333 , 123 , 'F421','FF45'), 
(2123 , 2333 ,'2FF45','2F421'), 
(2333 , 2123 , '2F421','2FF45'), 
(3 , 2 , 'AAAA','BBB'), 
(2 , 3 , 'BBB','AAAA') 

SELECT 
    a.* 
FROM 
    @t a 
WHERE 
    CASE 
    WHEN ConnectiondID > RelatedConnectionId 
    THEN RelatedConnectionId 
    ELSE NULL 
    END IS NULL 
+0

なぜ 'where'に' case'式がありますか?どうして 'どこでConnectiondID> RelatedConnectionId'をやってみませんか? – iamdave

+0

You right、\t ConnectiondID> RelatedConnectionIdまたはRelatedConnectionId IS NULLです。 –

関連する問題