Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL条件联接-基于联接表条件定义的联接点_Mysql_Sql_Postgresql_Postgresql 9.3 - Fatal编程技术网

Mysql SQL条件联接-基于联接表条件定义的联接点

Mysql SQL条件联接-基于联接表条件定义的联接点,mysql,sql,postgresql,postgresql-9.3,Mysql,Sql,Postgresql,Postgresql 9.3,情景: 在以下每一项中,创建日期、其他创建日期和日期均为一天,即2012-01-03 表1: 领域: ID |创建日期| 表2: 领域: ID |表1 | fk |其他|创建日期| 表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 W

情景: 在以下每一项中,创建日期、其他创建日期和日期均为一天,即2012-01-03

表1: 领域: ID |创建日期|

表2: 领域: ID |表1 | fk |其他|创建日期|

表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
)
基本上,我对表1+表2在表3上的连接感兴趣,如果第一个语句为true,我们在表1的日期连接,如果第二个语句为true,我们在表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)
例如,如果您使用两个外部联接而不是试图将它们合并为一个联接,那么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
-编辑-

下面是一个示例,其中一个紧凑编码的连接条件具有糟糕的性能,并且有一个解决方案,它的代码要多得多,但值得一试:


我宁愿以固定的方式连接表3两次,并使用条件表达式在选择列表中选择正确的值。@Shadow您能提供一个查询示例来实现这一点吗?现在我把它分解成两个独立的查询,然后用不同的语言添加这两个集合,但是我正试图把这些都写进SQLcan你能清理一下这个问题上的标签吗谢谢@Hambone我会回到这个语法来对照Bernd的解决方案进行测试-我很感激你能想出第二种解决问题的方法。关于完整的外部-我选择的原因是我的表3是实际上,只生成了一系列日期和天,完整的外部数据确保仍然包含计数为0的行。。。尽管可能还有更好的方法来实现这一点,但这是有意义的——谢谢。你有没有考虑过生成_系列而不是表3?是的,表3实际上就是这样的,是一个生成_系列,但我只是把它称为表3,以保持问题的简单和易于解释。我希望我能更容易地传达这样做为我节省了多少时间和精力。。。这几天我一直在讨论这个问题。谢谢,这工作做得很好