根据另一个表中的关键字从表中选择行

时间:2013-08-23 06:24:36

标签: sql sql-server

我有一些存储在数据库表中的界面元素,用户可以通过输入关键字(存储在另一个表中)进行过滤:

表按钮:

ID   Name
 1   Button1
 2   Button2
 3   Button3

表关键字:

ButtonID  Keyword 
       1  Garden
       2  House
       3  Garden
       3  House

如果用户输入Garden,则db返回Button1 and Button3

如果用户输入House,则db返回Button2 and Button3

如果用户输入Garden AND House,则db仅返回Button3

最后一个是问题,我设法把这个问题放在一起:

SELECT T.ID, T.Name
           , T.Type
           , T.Description
           , T.Action
           , T.Image 
FROM Tiles T 
JOIN Keywords K 
ON T.ID=K.TileID 
WHERE K.Keyword IN ('House', 'Garden')

不幸的是,此查询返回所有三个按钮以及任何提供的关键字。但我只想要所有提供的关键字Button3的元素。 查询应该如何实现?

非常感谢:)

3 个答案:

答案 0 :(得分:0)

使用Intersect

SELECT T.ID, T.Name, T.Type, T.Description, T.Action, T.Image FROM Tiles T JOIN Keywords K ON T.ID=K.TileID WHERE K.Keyword like 'House'
intersect  
SELECT T.ID, T.Name, T.Type, T.Description, T.Action, T.Image FROM Tiles T JOIN Keywords K ON T.ID=K.TileID WHERE K.Keyword like 'Garden'

那应该能得到你想要的东西。

答案 1 :(得分:0)

SELECT name 
FROM tableButtons 
WHERE tableButtons.id = tableKeywords.id AND tableButtons.id 
IN 
(SELECT tableKeywords.id 
   FROM tableKeywords 
   WHERE id IN (<insert keywords here>))

你可能已经知道,在上面的语句中执行的第一个查询将是子查询(内部选择),它将返回用户输入中匹配关键字的所有ID,然后这些ID将是在外部查询中使用,而外部查询又匹配两个表

答案 2 :(得分:0)

declare @params table (Keyword varchar(6) primary key)

insert into @params
select 'House' union all
select 'Garden'

select
    b.Name
from Keywords as k
    inner join Buttons as b on b.ID = k.ButtonID
where k.Keyword in (select Keyword from @params)
group by b.Name
having count(*) = (select count(*) from @params)

sql fiddle demo