1

1 つのテーブルの選択クエリに少し苦労していますが、2 つの同じ列を結合しています。問題を単純化するために、状況を再構築しました。次のようなテーブルを取得しました。

declare @DummyTable Table 
(
    Id int, 
    MainName varchar(20), 
    SubName varchar(20), 
    sequenceNumber int
)

このテーブルには、次のデータが含まれています。

insert into @DummyTable 
values ( 0, 'MainName1', 'SubName1', 1),
       ( 1, 'MainName1', 'SubName2', 2),
       ( 2, 'MainName1', 'SubName3', 3),
       ( 3, 'MainName1', 'SubName6', 4),
       ( 4, 'MainName1', 'SubName7', 5),
       ( 5, 'MainName2', 'SubName1', 1),
       ( 6, 'MainName2', 'SubName2', 2),
       ( 7, 'MainName2', 'SubName3', 3),
       ( 8, 'MainName2', 'SubName4', 4),
       ( 9, 'MainName2', 'SubName5', 5),
       (10, 'MainName2', 'SubName6', 6),
       (11, 'MainName2', 'SubName7', 7),
       (12, 'MainName3', 'SubName1', 1),
       (13, 'MainName3', 'SubName2', 2),
       (14, 'MainName3', 'SubName3', 3)

ここで、テキスト MainName1 を含むすべてのレコードを取得しようとします。同じ行に、次のように SubName 列で一致するレコード MainName2 も必要です。

Id | MainName  | SubName  | s | Id | MainName  | SubName  | s -- s = SequenceNumber
--------------------------------------------------------------
 5 | MainName2 | SubName1 | 1 |  0 | MainName1 | SubName1 | 1
 6 | MainName2 | SubName2 | 2 |  1 | MainName1 | SubName2 | 2
 7 | MainName2 | SubName3 | 3 |  2 | MainName1 | SubName3 | 3
 8 | MainName2 | SubName4 | 4 | NULL | NULL    | NULL     | NULL
 9 | MainName2 | SubName5 | 5 | NULL | NULL    | NULL     | NULL
10 | MainName2 | SubName6 | 6 |  3 | MainName1 | SubName6 | 4
11 | MainName2 | SubName7 | 7 |  4 | MainName1 | SubName7 | 5

次のクエリでこれを管理しようとします。

 select *
 from @DummyTable dt1
 left join @DummyTable dt2 on dt1.SubName = dt2.SubName
 where dt1.MainName like '%Name2%'
 and dt2.MainName like '%Name1%'
 order by dt1.MainName, dt1.sequenceNumber

しかし、このクエリを実行すると、必要な結果が得られますが、ID 8 と 9 のレコードが欠落しています。右結合、または結合のみ (左または右なし) を試みましたが、すべて同じ結果になり、ID 8 と 9 のレコードは表示されません。ここで何が間違っているのかわかりません。欠落しているレコードが表示されません。私の問題とそれを修正する方法を理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

2

このクエリを試してください:

select *
from @DummyTable dt1
left join @DummyTable dt2 on dt2.SubName = dt1.SubName and dt2.MainName like '%Name1%'
where dt1.MainName like '%Name2%' --and (dt2.MainName like '%Name1%')
order by dt1.MainName, dt1.sequenceNumber   

結果から一致しないレコードを除外した句nullのために、値が失われました。wheredt2.MainName like '%Name1%'

編集: 値が欠落している場合に常に null が返されるとは限らないため、クエリがうまく機能していdt2なかったため、引数を結合句に移動したところ、期待どおりに機能するようになりました。

于 2013-07-01T10:13:18.427 に答える