SQL 查询中表的复杂连接

Posted

技术标签:

【中文标题】SQL 查询中表的复杂连接【英文标题】:Complex Joins on tables in SQL Queries 【发布时间】:2014-02-02 03:25:39 【问题描述】:

我的问题是关于在查询中加入这些表。我们有 4 个名为 prsn 的表具有 prsn 详细信息,然后 *prsn_rltn 具有受益人的 id 但该受益人的详细信息将仅存在于 prsn 表中,即 PRSN_ID 将有个人ID和受益人ID*,然后我们有一个称为付款的表格,然后是一个称为付款表格的表格。下面是每个表格中的列。

**PRSN**:
PRSN_ID EMPLOYEE_ID NAME    BRTH_DT
**PRSN_RLTN**:
PRIM_PRSN_ID   SCND_PRSN_ID
**PAYMENT**:
PRSN_ID   PMT_ID   PMT_BEGIN_DATE
**PAYMENT FORM**:
PRSN_ID   PMT_FORM_ID

问题是我们必须让具有特定 pmt_id(ex:1000) 和 pmt_begin_date(ex:01/01/2014) 的人。他的 employee_id、name 和 brth_dt 应该与他的受益人的 id、name 和brth_dt。我编写了一个代码来显示除受益人详细信息之外的所有其他详细信息。所以请看下面的查询,让我知道如何显示收款人的详细信息。

SELECT
,A.PRSN_ID
,A.EMPLOYEE_ID
,A.NAME
,A.BRTH_DT
,B.PMT_ID
,B.PMT_BEGIN_DATE
,C.PMT_FORM_ID

FROM
&DATABASE.PRSN AS A

LEFT JOIN  &DATABASE.PAYMENT_FORM AS C
ON A.PRSN_ID = C.PRSN_ID
AND C.PMT_FORM_ID=200       

&DATABASE.PAYMENT AS B

WHERE
B.PMT_ID = 1000
AND B.PMT_BEGIN_DATE='01/01/2014'                         

【问题讨论】:

【参考方案1】:

您的查询在语法上是错误的。您需要为每个表提供JOIN,尝试以下查询,看看是否有帮助。另外LEFT JOINJOIN 也不一样,所以在使用它们之前请先阅读它们。

SELECT
    A.PRSN_ID
    ,A.EMPLOYEE_ID
    ,A.NAME
    ,A.BRTH_DT
    ,B.PMT_ID
    ,B.PMT_BEGIN_DATE
    ,C.PMT_FORM_ID
    ,B.PRSN_ID
    ,B.EMPLOYEE_ID
    ,B.NAME
FROM &DATABASE.PRSN AS A
    LEFT JOIN  &DATABASE.PAYMENT_FORM AS C
    ON A.PRSN_ID = C.PRSN_ID
    AND C.PMT_FORM_ID=200
    LEFT JOIN &DATABASE.PAYMENT AS P ON C.PMT_FORM_ID = P.PMT_ID
    LEFT JOIN PRSN_RLTN R ON R.PRIM_PRSN_ID = A.PRSN_ID
    LEFT JOIN &DATABASE.PRSN AS B ON B.PRSN_ID = R.SCND_PRSN_ID
WHERE
    B.PMT_ID = 1000
    AND B.PMT_BEGIN_DATE='01/01/2014'   

【讨论】:

您忘记加入PRSN_RLTN 表来获取收款人ID。 我问了,因为 OP 在上面强调了这一点;你总是可以做一个假设。 @Price 谢谢,我将修改我的答案以将其合并到查询中。 我明白了。你为什么要加入C.PMT_FORM_ID = P.PMT_ID?两者都是不同的值。 OPs 帖子没有任何关于付款与收款人的关系的信息。所以我认为这些值可能是相同的。

以上是关于SQL 查询中表的复杂连接的主要内容,如果未能解决你的问题,请参考以下文章

复杂的sql连接查询

SQL 查询时间复杂度 - 连接与子查询

具有复杂连接的sql查询

复杂的 SQL 连接查询 - 获取最新行

将具有许多连接的复杂 SQL 查询转换为 Eloquent

连接两个表的复杂 SQL 查询