【问题标题】:SQL LEFT JOIN combined with regular joinsSQL LEFT JOIN 与常规连接相结合
【发布时间】:2012-06-28 08:17:45
【问题描述】:

我有以下连接一堆表的查询。

我想从 INDUSTRY 表中获取每条记录,该表中的 secure_industry_id = 1,无论它是否与其他表匹配。我认为这需要通过 LEFT JOIN 来完成?

SELECT attr.industry_id        AS option_id,
       attr.industry           AS option_name,
       uj.ft_job_industry_id,
       Avg(CASE
             WHEN s.salary > 0 THEN s.salary
           END)                AS average,
       Count(CASE
               WHEN s.salary > 0 THEN attr.industry
             END)              AS count_non_zero,
       Count(attr.industry_id) AS count_total
FROM   industry attr,
       user_job_ft_job uj,
       salary_ft_job s,
       user_job_ft_job ut,
       [user] u,
       user_education_mba_school mba
WHERE  u.user_id = uj.user_id
       AND u.user_id = ut.user_id
       AND u.user_id = mba.user_id
       AND uj.ft_job_industry_id = attr.industry_id
       AND uj.user_job_ft_job_id = s.user_job_id
       AND u.include_in_student_site_results = 1
       AND u.site_instance_id IN ( 1 )
       AND uj.job_type_id = 1
       AND attr.consolidated_industry_id = 1
       AND mba.mba_graduation_year_id NOT IN ( 8, 9 )
       AND uj.admin_approved = 1
GROUP  BY attr.industry_id,
          attr.industry,
          uj.ft_job_industry_id 

这仅返回一行,但行业表中有 8 个匹配项,其中 encrypted_industry_id = 1。

--- 编辑:这里真正的问题是,如何将 LEFT JOIN 与常规连接结合起来?

【问题讨论】:

  • 首先将常规连接编写为 ANSI 连接...

标签: sql sql-server-2008 left-join


【解决方案1】:

对可能丢失相应记录的表使用left join。将每个表的条件放在joinon 子句中,而不是放在where 中,因为这实际上会使它们成为内部连接。比如:

select
  attr.industry_id AS option_id, attr.industry AS option_name,
  uj.ft_job_industry_id, AVG(CASE WHEN s.salary > 0 THEN s.salary END) AS average, 
  COUNT(CASE WHEN s.salary > 0 THEN attr.industry END) as count_non_zero,
  COUNT(attr.industry_id) as count_total 
from
  industry attr
  left join user_job_ft_job uj on uj.ft_job_industry_id = attr.industry_id and uj.job_type_id = 1 and uj.admin_approved = 1
  left join salary_ft_job s on uj.user_job_ft_job_id = s.user_job_id 
  left join [user] u on u.user_id = uj.user_id and u.include_in_student_site_results = 1 and u.site_instance_id IN (1)
  left join user_job_ft_job ut on u.user_id = ut.user_id
  left join user_education_mba_school mba on u.user_id = mba.user_id and mba.mba_graduation_year_id not in (8, 9)
where
  attr.consolidated_industry_id = 1 
group by
  attr.industry_id, attr.industry, uj.ft_job_industry_id

如果您知道任何表总是有相应的记录,请使用innser join

【讨论】:

  • 感谢您的及时回复。我在那里的 WHERE 子句上的语法不正确。想法?
  • @AdamLevitt:on 连接缺少 user_job_ft_job 子句。我重新排列了上面代码中的连接。
  • 是的,就是这样。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 2010-09-29
  • 1970-01-01
  • 2014-11-15
  • 2011-10-20
相关资源
最近更新 更多