如何按条件在不同字段上进行 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_type
和doc_series
列进行连接,如果doc_type
的值为02
,则连接应由doc_type
完成,@ 987654331@、doc_number
和 doc_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