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表,如下所示:

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

如何从中选择以返回与给定 GroupId 匹配但不在任何阻止范围(包括)内的所有数据?对于如果 GroupId 是德克萨斯州给出的数据,我不想返回 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 回答