【问题标题】:Select rows with "ONLY" a condition选择具有“仅”条件的行
【发布时间】:2020-06-24 18:30:26
【问题描述】:

我刚开始学习SQL,我正在使用teradata试用数据库进行练习(点击“执行试用”后使用db_pvfc9_std数据库)。 Here is a link 到具有数据库架构的文档。

我有几个带有 only 子句的查询,例如:

QUERY:只能使用 12in BandSaw 的员工叫什么名字?

所以,这就是我目前所拥有的:

SELECT Employee_Name
FROM   EMPLOYEE_T as ETT, EMPLOYEE_SKILLS_T as EST, SKILL_T as ST
WHERE  ETT.Employee_ID = EST.Employee_ID and EST.Skill_ID = ST.Skill_ID and ST.Skill_Description = 
'12in Band Saw'

我想我正在招募可以使用 12 英寸带锯的员工,但我不知道如何实施“唯一”部分,我不会让那些也可以使用其他类型的员工......有人可以解释一下吗?

谢谢!

【问题讨论】:

    标签: sql join select teradata


    【解决方案1】:

    永远不要FROM 子句中使用逗号。 始终使用正确、明确、标准、可读的JOIN语法。

    简单不学逗号。期间。

    你想要的是聚合。我认为:

    SELECT Employee_Name
    FROM EMPLOYEE_T ETT JOIN
         EMPLOYEE_SKILLS_T EST
         ON ETT.Employee_ID = EST.Employee_ID JOIN
         SKILL_T ST
         ON EST.Skill_ID = ST.Skill_ID 
    GROUP BY Employee_Name
    HAVING MIN(ST.Skill_Description) = MAX(ST.Skill_Description) AND
           MIN(ST.Skill_Description) = '12in Band Saw';
    

    【讨论】:

      【解决方案2】:

      你可以使用聚合:

      select ett.employee_name
      from employee_t as ett
      inner join employee_skills_t as est on ett.employee_id = est.employee_id
      inner join skill_t as st on est.skill_id = st.skill_id
      group by ett.employee_name
      having 
          min(st.skill_description) = max(st.skill_description)
          and min(st.skill_description) = '12in Band Saw'
      

      查询加入表,然后按员工分组; the, having 子句确保每个组只有一种不同的技能,并且它对应于所寻求的值。

      请注意,此查询使用标准联接(使用 on 关键字)而不是隐式联接(在 from 子句中使用逗号)。由于您刚刚开始学习 SQL,因此这是一个要永久接受的习惯。

      【讨论】:

      • @TimBiegeleisen:啊啊啊,你抓到我了。至少我的编辑风格是一致的!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多