将规范化表格减少为一个值

时间:2011-01-14 16:45:41

标签: sql

我确信这已被问到,但我不太确定如何正确搜索这个问题,我很抱歉。

我有两张桌子,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

等等

有人能指出我如何思考这个问题或我应该做什么的正确方向?谢谢。

4 个答案:

答案 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

Proof with your sample data pasted over at PasteBin