有没有一种方法可以使用目标的串联字段来联接表?

时间:2019-02-11 21:26:27

标签: sql join sybase concat advantage-database-server

我正在尝试从作业跟踪系统中查询一系列Sybase Advantage表,以便生成正在进行的作业及其相关的到期日期的报告。

此系统对作业及其子装配使用“父/子”关系。作业数据(父级)存在于“发布”表中,子部件数据(子级)存在于“ pnlrel”表中。 “发布”表中存在作业的截止日期,但“ pnlrel”表中未存在子装配的截止日期。我正在尝试建立查询以某种方式联接表,以允许使用父项的到期日来代表输出中的子项。该数据库是Sybase Advantage 11。

涉及的表和字段是:

  1. 进行-正在进行的工作,包括父母和孩子。

    • H-JOB#-作业编号和版本ID(即ABC-0100-001;作业ABC-0100,版本-001) | H-JOB#| | ABC-0100-001 | | ABC-0101-002 | | ABC-0100-001P01 | | ABC-0101-002P01 |
  2. 发布-所有父母 -JOB#-直接匹配到H-JOB#

    • R-DUE-DATE-作业的截止日期 | JOB#| R-DUE-DATE | | ABC-0100-001 | 2000年1月1日| | ABC-0101-002 | 2020年1月1日|
  3. pnlrel-所有孩子

    • P-JOB-NBR-主要工作编号(即ABC-0100)
    • P-REL-NBR-作业的发布ID(即-001) | P-JOB-NBR | P-REL-NBR | P-REL-ID | | ABC-0100 | 001 | P01 | | ABC-0100 | 001 | P01 |

为清楚起见,示例中未涉及其他几个表。

我试图直接连接两个表,甚至基于一个表中的值串联等于另一个表的单个字段中的值来联接它们,但仍然没有得到所需的输出。

SELECT inproces."H-JOB#", release."R-DUE-DATE"
FROM inproces 
left join release on inproces."H-JOB#" = release."R-TRACKING-NBR"
left join pnlrel on inproces."H-JOB#" = pnlrel."P-TRACKING-NBR"

这将返回父母的工作编号和到期日期,而不是孩子的工作日期。

|ABC-0100-001   | 01/01/2000 | (parent)
|ABC-0100-001P01| NULL   |(child)
|ABC-0101-002   | 01/01/2020 | (parent)
|ABC-0101-002P01| NULL   |(child)

理想的结果是让孩子显示父母的到期日,因为它没有自己的日期:

|ABC-0100-001    | 01/01/1901 | (parent)
|ABC-0100-001P01 | 01/01/1901 | (child displays parent's due date)
|ABC-0101-002    | 01/01/2020 | (parent)
|ABC-0101-002P01 | 01/01/2020 | (child displays parent's due date)

1 个答案:

答案 0 :(得分:0)

如果我正确理解了父代和子代标识符的形成方式,那么以下查询应该可以解决问题:

SELECT inproces."H-JOB#", release."R-DUE-DATE"
FROM inproces 
LEFT JOIN release 
    ON inproces."H-JOB#" LIKE CONCAT(release."R-TRACKING-NBR", '%')

这应该足够宽松,以允许子进程(例如,"H-JOB#"的值看起来像'ABC-0100-001P01')找到其父发行版("R-TRACKING-NBR"'ABC-0100')。