SQL 条件连接 - 根据 joined_table 条件定义的连接点
SQL conditional JOIN - JOIN point defined based on joined_table conditions
场景:
在下面的每一个中,"created date"、"other_created_date" 和 "date" 是一天(即 2012-01-03)
Table 1:
字段:
编号 | created_date
Table 2:
字段:
编号 | table_1_fk |其他_created_date
Table 3:
字段:
日期
目标:
我想执行以下操作:
SELECT * FROM table_1
JOIN table_2
ON table_1.id = table_2.table_1_fk
FULL OUTER JOIN table_3
ON table_3.date = (
CASE
WHEN table_1.created_date > table_2.other_created_date THEN table_1.created_date
ELSE table_2.other_created_date
END
)
基本上,我对 (Table_1 + Table_2) JOINed on Table_3 感兴趣,如果第一个语句为真,我们就加入 Table_1's日期,如果第二个陈述为真,我们将在 Table_2 的日期
加入
这可能吗,或者有更好的方法吗?
SELECT * FROM table_1
JOIN table_2
ON table_1.id = table_2.table_1_fk
FULL OUTER JOIN table_3
ON table_3.date = GREATEST(table_1.created_date,table_2.other_created_date)
我喜欢 Bernd 的回答。但是,在对这些表的内容一无所知的情况下,我认为值得您花时间来评估执行您的建议与仅使用两个单独的外部联接之间的性能差异。我知道我以前在join中做过一些有创意的事情,数据库会管理它,但是它如何管理它可能根本不是我想要的,尤其是在处理数千万条记录的时候。
例如,如果您使用两个外部联接而不是尝试将它们合并为一个,则 SQL 可能看起来像这样。它可能会包含更多代码,这就是为什么您需要对其进行基准测试以查看它是否重要。
我知道我在这里使用了左连接 -- 当我看到一个完整的外部时我总是有点怀疑,但这并不是说它不是您想要的。但这仅用于说明目的:
SELECT
case
when table_1.created_date > table_2.other_created_date then
t3a.<field_1>
else
t3b.<field_1>
end
FROM
table_1
JOIN table_2
ON table_1.id = table_2.table_1_fk
left join table3 t3a on
table3.date = table_1.created_date
left join table3 t3b on
table3.date = table_2.other_created_date
-- 编辑--
这是一个示例,其中紧凑编码的连接条件具有糟糕的性能,而解决方法的代码更多但值得:
场景:
在下面的每一个中,"created date"、"other_created_date" 和 "date" 是一天(即 2012-01-03)
Table 1:
字段:
编号 | created_date
Table 2:
字段:
编号 | table_1_fk |其他_created_date
Table 3:
字段:
日期
目标:
我想执行以下操作:
SELECT * FROM table_1
JOIN table_2
ON table_1.id = table_2.table_1_fk
FULL OUTER JOIN table_3
ON table_3.date = (
CASE
WHEN table_1.created_date > table_2.other_created_date THEN table_1.created_date
ELSE table_2.other_created_date
END
)
基本上,我对 (Table_1 + Table_2) JOINed on Table_3 感兴趣,如果第一个语句为真,我们就加入 Table_1's日期,如果第二个陈述为真,我们将在 Table_2 的日期
加入这可能吗,或者有更好的方法吗?
SELECT * FROM table_1
JOIN table_2
ON table_1.id = table_2.table_1_fk
FULL OUTER JOIN table_3
ON table_3.date = GREATEST(table_1.created_date,table_2.other_created_date)
我喜欢 Bernd 的回答。但是,在对这些表的内容一无所知的情况下,我认为值得您花时间来评估执行您的建议与仅使用两个单独的外部联接之间的性能差异。我知道我以前在join中做过一些有创意的事情,数据库会管理它,但是它如何管理它可能根本不是我想要的,尤其是在处理数千万条记录的时候。
例如,如果您使用两个外部联接而不是尝试将它们合并为一个,则 SQL 可能看起来像这样。它可能会包含更多代码,这就是为什么您需要对其进行基准测试以查看它是否重要。
我知道我在这里使用了左连接 -- 当我看到一个完整的外部时我总是有点怀疑,但这并不是说它不是您想要的。但这仅用于说明目的:
SELECT
case
when table_1.created_date > table_2.other_created_date then
t3a.<field_1>
else
t3b.<field_1>
end
FROM
table_1
JOIN table_2
ON table_1.id = table_2.table_1_fk
left join table3 t3a on
table3.date = table_1.created_date
left join table3 t3b on
table3.date = table_2.other_created_date
-- 编辑--
这是一个示例,其中紧凑编码的连接条件具有糟糕的性能,而解决方法的代码更多但值得: