2

我不知道我的标题是否正确传达了我想要实现的查询,所以请编辑或建议一个更正确的更好的查询。我正在尝试将这两个表连接在一起:

表 1:

id |field1|field2|
------------------
1  
2
3
4
.
.
. (etc)

表 2:食物

person.id | name
1         | chicken
1         | pork
1         | beef
2         | pork
2         | chicken
3         | chicken
4         | beef
.
. (etc)

我需要根据搜索 ID 与猪肉或鸡肉都匹配的任何人来加入这些表。例如,如果我搜索pork,应该返回 1 和 2,如果我搜索porkand chicken,仍然应该返回 1 和 2,但是 3 不会是因为它不chicken匹配pork。如果我搜索porkchickenbeef,则应该只返回 1。

我一直在看这个问题,但我不知道我要搜索多少项目(我可能会搜索porkandchicken一次,and porkchickenbeef另一次)。

我开始尝试基本WHERE条款,我相当肯定它是错误的(我确认了这一点,因为查询不起作用):

SELECT p.id 
FROM people p, foods f 
WHERE p.id = f.person_id AND (f.name = 'pork' AND f.name = 'chicken')

但这不会返回任何结果。我似乎记得几年前的 SQL 教程中我应该将EXISTS关键字与子查询一起使用,但我不确定如何根据它来塑造我的查询/查询。

编辑:SQL Server CE 不支持该INTERSECT关键字,所以很遗憾我无法使用该选项。

4

3 回答 3

3

如果您可以构建您的列表('chicken', 'pork', 'beef')并计算应用程序中的项目:

SELECT p.*
FROM   people AS p
  JOIN (
   SELECT person_id
   FROM   foods
   WHERE  name IN ('chicken', 'pork', 'beef')   --- list
   GROUP  BY person_id
   HAVING COUNT(*) = 3                          --- list size
   ) AS pf ON pf.person_id = p.id ;
于 2012-06-26T22:11:03.663 回答
2

改为使用 group by:

select id
from foods
where name in (<list of foods>)
group by id
having count(*) = <size of list>

您可以 - 恐怖的恐怖 - 实际上将列表存储在字符串中并获得正确的结果。假设你有:

declare @foodlist varchar(8000) = 'pork,chicken'

然后以下查询有效:

select id
from foods
where charindex(','+name+',', ','+@foodlist+',') > 0
group by id
having count(*) = 1 + len(@foodlist) - len(replace(@foodlist, ',', ''))
于 2012-06-26T21:50:08.150 回答
0
SELECT p.id 
FROM people p INNER JOIN foods f 
ON p.id = f.person_id 
WHERE f.name in (`list of f.name`)

如果我搜索猪肉、鸡肉和牛肉,则不应返回任何内容

根据您的表1应该返回。

于 2012-06-26T22:06:48.730 回答