将旧连接更改为新连接

时间:2016-12-14 21:45:39

标签: sql

我是SQL的新手,所以非常感谢任何帮助。我有一个似乎有旧样式连接的查询,我需要将其更改为新的样式连接。当前查询如下:

SELECT
    STAR.V_DISASTER_DIMENSIONS     .DISASTER_NUMBER,
    STAR.PA_PROJECT_DIMENSIONS     .PW_NUMBER,
    STAR.PA_PROJECT_SITE_DIMENSIONS.SITE_NUMBER,
    STAR.PA_PROJECT_FACTS          .PROJECT_AMOUNT,
    STAR.PA_MITIGATION_DIMENSIONS  .MITIGATION_ACTIVITY_STATUS
FROM
    STAR.V_DISASTER_DIMENSIONS,
    STAR.PA_PROJECT_DIMENSIONS,
    STAR.PA_PROJECT_SITE_DIMENSIONS,
    STAR.PA_MITIGATION_DIMENSIONS,
    STAR.PA_PROJECT_FACTS,
    STAR.PA_PROJECT_SITE_FACTS
WHERE 
    ( STAR.PA_PROJECT_DIMENSIONS.PA_PROJECT_ID = STAR.PA_PROJECT_FACTS.PA_PROJECT_ID  )
    AND
    ( STAR.PA_PROJECT_FACTS.DISASTER_ID = STAR.V_DISASTER_DIMENSIONS.DISASTER_ID  )
    AND
    ( STAR.PA_MITIGATION_DIMENSIONS.PA_MITIGATION_ID = STAR.PA_PROJECT_FACTS.PA_PROJECT_ID  )
    AND
    ( STAR.PA_PROJECT_SITE_FACTS.PA_PROJECT_ID = STAR.PA_MITIGATION_DIMENSIONS.PA_MITIGATION_ID  )
    AND
    ( STAR.PA_PROJECT_SITE_FACTS.DISASTER_ID = STAR.V_DISASTER_DIMENSIONS.DISASTER_ID  )
    AND
    ( STAR.PA_PROJECT_SITE_FACTS.PA_PROJECT_ID = STAR.PA_PROJECT_DIMENSIONS.PA_PROJECT_ID  )
    AND
    ( STAR.PA_PROJECT_SITE_FACTS.PA_PROJECT_SITE_ID = STAR.PA_PROJECT_SITE_DIMENSIONS.PA_PROJECT_SITE_ID  )

我的转换尝试如下。我不知道在哪里放置额外的条件,因为它们与表格不是1比1。

FROM
    STAR.V_DISASTER_DIMENSIONS
    JOIN STAR.PA_PROJECT_SITE_FACTS ON STAR.PA_PROJECT_SITE_FACTS.DISASTER_ID = STAR.V_DISASTER_DIMENSIONS.DISASTER_ID  
    JOIN STAR.PA_PROJECT_DIMENSIONS ON STAR.PA_PROJECT_SITE_FACTS.PA_PROJECT_ID = STAR.PA_PROJECT_DIMENSIONS.PA_PROJECT_ID 
    JOIN STAR.PA_PROJECT_SITE_DIMENSIONS ON STAR.PA_PROJECT_SITE_FACTS.PA_PROJECT_SITE_ID = STAR.PA_PROJECT_SITE_DIMENSIONS.PA_PROJECT_SITE_ID
    JOIN STAR.PA_MITIGATION_DIMENSIONS ON STAR.PA_PROJECT_SITE_FACTS.PA_PROJECT_ID = STAR.PA_MITIGATION_DIMENSIONS.PA_MITIGATION_ID
    JOIN STAR.PA_PROJECT_FACTS ON (
        STAR.PA_PROJECT_FACTS        .DISASTER_ID      = STAR.V_DISASTER_DIMENSIONS.DISASTER_ID AND 
        STAR.PA_MITIGATION_DIMENSIONS.PA_MITIGATION_ID = STAR.PA_PROJECT_FACTS     .PA_PROJECT_ID AND
        STAR.PA_PROJECT_DIMENSIONS   .PA_PROJECT_ID    = STAR.PA_PROJECT_FACTS     .PA_PROJECT_ID
    )

4 个答案:

答案 0 :(得分:0)

Select * from  
a,b
where a.z = b.y

将写为

Select * from
a
INNER JOIN
b
ON a.z = b.y

答案 1 :(得分:0)

很容易。只需从fact表开始,然后在foreign key = key上加入相关的表。

答案 2 :(得分:0)

使用Delete条件将,更改为INNER JOIN

ON

答案 3 :(得分:0)

首先,您应该使用表别名来使查询更具可读性。也可以使用一些小写字母。

然后只需在纸上写下表名(或别名),并为每个条件从一个表到另一个表画一条线。然后选择一个表开始,例如, pa_project_site_dimensions只链接到一个表格。

SELECT
  dd.disaster_number,
  pd.pw_number,
  psd.site_number,
  psf.project_amount,
  md.mitigation_activity_status
FROM star.pa_project_site_dimensions psd
JOIN star.pa_project_site_facts psf ON psf.pa_project_site_id = psd.pa_project_site_id
JOIN star.v_disaster_dimensions dd ON dd.disaster_id = psf.disaster_id
JOIN star.pa_mitigation_dimensions md ON md.pa_mitigation_id = psf.pa_project_id
JOIN star.pa_project_dimensions pd ON pd.pa_project_id = psf.pa_project_id
JOIN star.pa_project_facts pf ON  pf.disaster_id = dd.disaster_id
                              AND pf.pa_project_id = md.pa_mitigation_id
                              AND pf.pa_project_id = pd.pa_project_id
;

然而,这是一个奇怪的查询。首先,没有限制条件,您只需加入所有记录,而不是检索一个特定项目的数据。

此外,你处理几个方面。显然,项目有事实(pa_project_facts)和维度(pa_project_dimensions)。有5个事实和3个维度,你可以获得15行所有组合。然后还有项目网站(可能是我们在查询中看不到的表pa_project_sites)。要么项目网站有自己的事实(pa_project_site_facts),你也要与所有行合并,或者项目网站通过pa_project_site_facts链接到项目事实,但是pa_project_facts不会' t必须仅由pa_project_id加入,但也必须由某个事实ID加入。

这看起来很奇怪:md.pa_mitigation_id = psf.pa_project_id。缓解是否与项目相同?

因此,毕竟看看所有需要加入的列。想想这些表是如何相关的,以及你是否构建了没有意义的组合。