我确信这已被问到,但我不太确定如何正确搜索这个问题,我很抱歉。
我有两张桌子,Foo和Bar。因为每个食物有一行,每个食物匹配描述符就有很多行。
名称编号
Apple 1
橙2
id description
1个好吃的
1成熟的
2甜点
等(对于有些人为的例子,我很抱歉。)
我正在尝试返回一个查询,其中如果,对于Foo中的每一行,Bar包含一个描述符('Tasty','Juicy')返回true 例如:
Apple True
橙色错误
当我只有一个项目来匹配时,我一直在解决这个问题。
选择
Foo.name,
案例bar.description
当'美味'然后是真的
别的'假'
结束
来自Foo
左边加入吧foo.id = bar.id
其中bar.description ='好吃'
但是对于多个项目,我最后会留下额外的行:
Apple True
Apple False
等等
有人能指出我如何思考这个问题或我应该做什么的正确方向?谢谢。
答案 0 :(得分:3)
您需要使用子查询
select foo.name
from foo
where foo.id in (
select bar.id
from bar
where bar.description in ('Tasty', 'Juicy')
)
正如Martin指出的那样,上述查询并未完全提供OP想要的内容。以下是固定版本。
select
foo.name,
case
when r.id is null then 'True'
else 'False'
end as IsTastyOrJucy
from foo
left join (
select foo.name
from foo
where foo.id in (
select bar.id
from bar
where bar.description in ('Tasty', 'Juicy')
)
) as R
答案 1 :(得分:2)
根据您的DBMS,您需要以下内容:
SELECT
id, name,
CAST(CASE
WHEN EXISTS (SELECT NULL FROM bar WHERE
bar.id = foo.id
AND bar.description IN ('Tasty', 'Juicy')
) THEN 1
ELSE 0
END AS BIT) AS HasBar
FROM
foo
答案 2 :(得分:1)
试试这个:
select id, name
from foo
where exists (
select 1 from bar where bar.id = foo.id
and bar.Description in ('tasty', 'ripe')
)
答案 3 :(得分:0)
试试这个?
SELECT F.Name,
CASE WHEN B.Description IN ('Tasty', 'Juicy')
THEN 'True'
ELSE 'False'
END AS IsTastyOrJuicy
FROM Foo AS F
LEFT JOIN Bar AS B ON B.ID = F.ID
GROUP BY F.Name, B.Description