【问题标题】:SQL JOIN 3 Tables all query combinationsSQL JOIN 3 表所有查询组合
【发布时间】:2015-06-21 20:12:00
【问题描述】:

Table_A (PK,VALUE)

  • | 1 |福克斯 |
  • | 2 |缔约方会议 |
  • | 3 |出租车 |
  • | 4 |林肯 |
  • | 5 |亚利桑那州 |
  • | 6 |华盛顿 |
  • | 7 |戴尔 |
  • | 10 |朗讯 |

表_B (PK,VALUE)

  • | 1 |小跑 |
  • | 2 |汽车 |
  • | 3 |驾驶室 |
  • | 6 |纪念碑 |
  • | 7 |电脑 |
  • | 8 |微软 |
  • | 9 |苹果|
  • | 11 |苏格兰威士忌 |

表_C (PK,VALUE)

  • | 1 |向上 |
  • | 3 |对 |
  • | 7 |左 |
  • | 10 |东 |
  • | 11 |西 |
  • | 14 |下 |
  • | 20 |北 |
  • | 21 |南 |

需要编写哪些 MySQL JOIN 查询来获取所示 VENN 图中的每个单独区域:

因此,每个区域的输出应显示每个表中匹配的键值对。检查下面的 7 以了解运行查询后应显示的内容。

1 => 4,5

2 => 8,9

3 => 2,6

4 => 14,20,21

5 => 10

6 => 11

7 => 1,3,7 as {(1,FOX;1,TROT;1,UP),(3,TAXI;3,CAB;3,RIGHT),(7,DELL;7,PC; 7,左)}

【问题讨论】:

  • 似乎是什么问题?你都尝试了些什么?你被困在哪里了?
  • 大多数情况下,除了 7 的完整交集之外,我一直在尝试构建所有内容,我的查询如下:SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B. Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_a A INNER JOIN table_b B on A.PK=B.PK INNER JOIN table_c C on A.PK=C.PK;
  • 例如,对于区域 1,您尝试过什么,您在哪里卡住了?为什么它不起作用?这些是非常简单的joinexcept 查询...
  • 好吧也算出了 1:SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B.Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_a A LEFT JOIN table_b B on B.PK=A.PK LEFT JOIN table_c C on C.PK=A.PK 其中 B.PK 为 NULL,C.PK 为 NULL;
  • 不明白为什么这个问题被否决但是我们不应该在这个网站上提出我们难以解决的问题吗?这个问题非常直接、清晰且有用,再次了解为什么投反对票?

标签: mysql sql select join


【解决方案1】:

/* 1 */

SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B.Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_a A LEFT JOIN table_b B on B.PK =A.PK LEFT JOIN table_c C on C.PK=A.PK 其中 B.PK 为 NULL,C.PK 为 NULL;

/* 2 */

SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B.Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_b B LEFT JOIN table_a A on B.PK =A.PK LEFT JOIN table_c C on C.PK=B.PK 其中 C.PK 为 NULL,A.PK 为 NULL;

/* 3 */

SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B.Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_a A INNER JOIN table_b B on A.PK =B.PK LEFT JOIN table_c C on A.PK=C.PK 其中 A.PK=B.PK 和 C.PK 为 NULL;

/* 4 */

SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B.Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_c C LEFT JOIN table_a A on C.PK =A.PK LEFT JOIN table_b B on C.PK=B.PK 其中 A.PK 为 NULL,B.PK 为 NULL;

/* 5 */

SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B.Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_a A LEFT JOIN table_b B on A.PK =B.PK INNER JOIN table_c C on A.PK=C.PK 其中 A.PK=C.PK 且 B.PK 为 NULL;

/* 6 */

SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B.Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_b B LEFT JOIN table_a A on A.PK =B.PK INNER JOIN table_c C on B.PK=C.PK 其中 B.PK=C.PK 且 A.PK 为 NULL;

/* 7 */

SELECT A.PK as A_PK, A.Value as A_Value, B.PK as B_PK, B.Value as B_Value, C.PK as C_PK, C.Value as C_Value from table_a A INNER JOIN table_b B on A.PK =B.PK INNER JOIN table_c C on A.PK=C.PK;

现在我想知道这是否可以通过将 JOIN 子句保持为 INNER JOIN 并且不混合 LEFT 或 RIGHT JOINS 来完成,但我不想再次因发布问题而被否决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2014-05-24
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多