【问题标题】:Is This Join Possible?这个加入可能吗?
【发布时间】:2018-10-30 18:37:58
【问题描述】:

我有几个这样的表。

table_a     |   table_b
-------------------------
prim_key    |   prim_key
zero_or_one |   value1
valueA      |   value2
valueB      |   value3
valueZ      |

我希望做的是从TABLE B 检索所有值(prim_keyvalue1value2value3),如果每个表的主键和@ 的值匹配TABLE A 中的 987654328@ 是 0

我对@9​​87654331@ 完全陌生,我不确定我应该为此使用哪个联接,但似乎FULL OUTER JOIN 最合适。

SELECT table_b.*
FROM table_a
FULL OUTER JOIN table_b
ON table_a.prim_key = table_b.prim_key

这可能吗?

我是否使用了正确的联接来完成这项工作?

我的“全选”语法正确吗?

【问题讨论】:

  • MySQL 没有FULL OUTER JOIN
  • @MadhurBhaiya 你是认真的吗?!?!
  • 是的,他是认真的,你可以像我回答的那样在 MYSQL 中模拟 FULL OUTER JOIN。
  • 我认为一些具有预期输出的样本数据(尤其是覆盖边缘情况)会有所帮助。
  • @Anthony -> “我为什么要为我认为非常简单的 SQL 查询提供 MCVE?” meta.stackoverflow.com/questions/333952/…

标签: mysql database join mysql-5.6


【解决方案1】:

因为只有在table_a 中找到匹配的主键时,您才需要来自table_b 的条目;在这种情况下,一个简单的Inner Join 就足够了

SELECT table_b.*
FROM table_b
INNER JOIN table_a
  ON table_a.prim_key = table_b.prim_key AND 
     table_a.zero_or_one = 0

【讨论】:

  • 你误解了我的问题。有两个条件:(1)两个表中的prim_key必须相互匹配,(2)TABLE A中的zero_or_one的值必须是0
  • @Anthony 我在这里做的完全一样。除非这两个条件是OR 而不是AND ?
  • nono,两个条件都是AND条件。因为table_a 还将包含额外的数据列,使用inner join 不会同时搜索/扫描我们不需要扫描的一堆数据?我会修改我的问题,以便您明白我的意思。
  • @Anthony 他是对的,这是所需的查询。“不也搜索/扫描一堆我们不需要扫描的数据吗?”你需要有索引。 table_a(prim_key, zero_or_one)table_b(prim_key) 那么查询将执行得很好。
  • 如果你没有索引@Anthony 然后 MySQL 使用嵌套块算法来搜索匹配的算法或多或少 for(...) { for (...) { if(row[value] != where[filter]) { continue; } send_record_to_client() } } 两个表.. 嵌套循环变得更多的表你有。
【解决方案2】:

这个答案并不意味着真正的答案,这意味着如何在 MySQL 中模拟 FULL OUTER JOIN。

MySQL 不支持 FULL OUTER JOIN,您可以使用 LEFT JOIN、UNION ALL 和 RIGHT JOIN 来模拟它

SELECT * FROM table_a LEFT JOIN table_b ON table_a.prim_key = table_b.prim_key
UNION ALL
SELECT * FROM table_a RIGHT JOIN table_b ON table_a.prim_key = table_b.prim_key
WHERE table_a.prim_key IS NULL

【讨论】:

  • full outer join(或其模拟)我应该为此使用的连接类型?我对您的解决方案(以及我的问题中的假设解决方案)的担忧是它可能会增加不必要的复杂性,从而降低性能。
  • @Anthony 我的回答更多的是关于如何在 MySQL 中模拟 FULL OUTER JOIN 的答案,我猜它并不是你的问题的真正答案..
  • 好的。所以我的最后一个问题仍然存在。 (附言我已经更新了我的问题中的表格以更好地反映实际情况。)因为 full outer join 不存在(如果它甚至是最适合首先使用的连接),什么是最合适的加入我的需求?
猜你喜欢
  • 1970-01-01
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多