0

次のフィールドとデータを持つテーブルTaggedDataがあります

ID  GroupID  Tag    MyData
**  *******  ***    ******
1    Texas   AA01   Peanut Butter
2    Texas   AA15   Cereal
3    Ohio    AA05   Potato Chips
4    Texas   AA08   Bread

次のようにBlockedTagsの2番目のテーブルがあります。

ID  StartTag  EndTag
**  ********  ******
1     AA00     AA04 
2     AA15     AA15

これから選択して、特定のGroupIdに一致するが、ブロックされた範囲(両端を含む)にないすべてのデータを返すにはどうすればよいですか?GroupIdがTexasの場合に与えられるデータについては、2番目の範囲に一致するため、Cerealを返したくありません。パンのみを返す必要があります。

左結合ベースのクエリを試しましたが、それほど近くにはありません。

ありがとう

4

2 に答える 2

1
create table TaggedData (
    ID int,
    GroupID varchar(16),
    Tag char(4),
    MyData varchar(50))

create table BlockedTags (
    ID int,
    StartTag char(4),
    EndTag char(4)
)

insert into TaggedData(ID, GroupID, Tag, MyData)
values (1, 'Texas',   'AA01',   'Peanut Butter')
insert into TaggedData(ID, GroupID, Tag, MyData)
values (2, 'Texas' ,  'AA15',   'Cereal')
insert into TaggedData(ID, GroupID, Tag, MyData)
values (3, 'Ohio ',   'AA05',   'Potato Chips')
insert into TaggedData(ID, GroupID, Tag, MyData)
values (4, 'Texas',   'AA08',   'Bread')

insert into BlockedTags(ID, StartTag, EndTag)
values (1,     'AA00',     'AA04')
insert into BlockedTags(ID, StartTag, EndTag)
values (2,     'AA15',     'AA15')

select t.* from TaggedData t
left join BlockedTags b on t.Tag between b.StartTag and b.EndTag
where b.ID is null

戻り値:

ID          GroupID          Tag  MyData
----------- ---------------- ---- --------------------------------------------------
3           Ohio             AA05 Potato Chips
4           Texas            AA08 Bread

(2 row(s) affected)

したがって、特定のGroupIDに一致させるには、次のようにクエリを変更します。

select t.* from TaggedData t
left join BlockedTags b on t.Tag between b.StartTag and b.EndTag
where b.ID is null and t.GroupID=@GivenGroupID
于 2013-03-26T12:05:30.213 に答える
0

通常、大規模なデータで読みやすさ、使いやすさ、パフォーマンスが向上するという理由だけで、NOT EXISTSをお勧めします(いくつかのケースでは、より良い実行プランが得られます)。

このようになります:

SELECT * from TaggedData
WHERE GroupID=@GivenGroupID
AND NOT EXISTS(SELECT 1 FROM BlockedTags WHERE Tag BETWEEN StartTag ANDEndTag)
于 2013-03-26T12:54:01.923 に答える