如何按条件在不同字段上进行 INNER JOIN

Posted

技术标签:

【中文标题】如何按条件在不同字段上进行 INNER JOIN【英文标题】:How to make INNER JOIN ON different fields by condition 【发布时间】:2018-03-28 09:33:50 【问题描述】:

我需要根据doc_type字段的值,通过不同的条件制作inner join

这是架构

Person (
  ...
  doc_type VARCHAR2(40),
  doc_series VARCHAR2(4),
  doc_number VARCHAR2(6),
  doc_date DATE
)

Document (
  id INTEGER,
  type VARCHAR2(40),
  series VARCHAR2(4),
  number VARCHAR2(6),
  date DATE
)

例如,如果doc_type 的值为01,我需要通过doc_typedoc_series 列进行连接,如果doc_type 的值为02,则连接应由doc_type 完成,@ 987654331@、doc_numberdoc_date

类似的东西

SELECT d.* FROM document d
INNER JOIN person p ON
(CASE when d.doc_type = '01' then
  p.doc_type = d.type AND
  p.doc_series = d.series
      when d.doc_type = '02' then
  p.doc_type = d.type AND
  p.doc_series = d.series AND 
  p.doc_number = d.doc_number AND
  p.doc_date = d.doc_date
);

如何在 Oracle DB 中做到这一点?

【问题讨论】:

在 WHERE 和 ON 子句中使用 AND/OR 结构而不是 case 表达式通常会更好。 【参考方案1】:

我认为你需要这个

SELECT d.* 
FROM document d
INNER JOIN person p ON p.doc_series = d.series AND
( d.doc_type = '01' AND p.doc_type = d.type) OR
( d.doc_type = '02' AND p.doc_type = d.type AND p.doc_number = d.doc_number AND
  p.doc_date = d.doc_date)

【讨论】:

【参考方案2】:
SELECT d.* FROM document d
INNER JOIN person p ON (
(d.doc_type = '01' AND p.doc_type = d.type AND p.doc_series = d.series)
OR
( d.doc_type = '02' AND p.doc_type = d.type AND p.doc_series = d.series AND 
  p.doc_number = d.doc_number AND
  p.doc_date = d.doc_date)
);

【讨论】:

【参考方案3】:

我宁愿使用 union with 来连接符合条件的表:

   SELECT d.* FROM document d
INNER JOIN person p ON
  p.doc_type = d.type AND
  p.doc_series = d.series
where d.doc_typ = '01'
UNION ALL
SELECT d.* 
FROM document d
INNER JOIN person p ON
  p.doc_type = d.type AND
  p.doc_series = d.series AND 
  p.doc_number = d.doc_number AND
  p.doc_date = d.doc_date
where d.doc_typ = '02'

【讨论】:

【参考方案4】:

如果你真的在寻找 CASE,试试这个:

SELECT d.* 
FROM document d
INNER JOIN person p ON 
  (CASE when (p.doc_type = d.type AND
            p.doc_series = d.series) then
            '01'
      when ( p.doc_type = d.type AND
             p.doc_series = d.series AND 
             p.doc_number = d.doc_number AND
             p.doc_date = d.doc_date) then
             '02'
    end ) = p.doc_type;

由于您没有正确提及表中的列名,因此我使用了您提供的查询。请检查列并运行它。希望对您有所帮助。

【讨论】:

以上是关于如何按条件在不同字段上进行 INNER JOIN的主要内容,如果未能解决你的问题,请参考以下文章

是否应该在 SQLite 中使用 GROUP BY 在 UNION 上进行 INNER JOIN 花费数小时?

Symfony 2:使用理论查询构建器在非相关表上进行 INNER JOIN

left join分页查询

26.MySQL中的内连接INNER JOIN

关于SQL数据库中cross join 和inner join用法上的区别?

linq left join ,inner join ,crossjoin