【问题标题】:sql select two tables with foregin keysql用外键选择两个表
【发布时间】:2017-11-13 04:31:46
【问题描述】:

我想将两张表合二为一。 第一个是:

ID    code_1      code_2
==============================
1      XXX        YYY
2      ZZZ        YYY
3      YYY        ZZZ

第二个是:

CODE    Name
==============
XXX     Name_1
YYY     Name_2
ZZZ     Name_3

有一个 FK code_1= CODE 和 code_2 = CODE 我想用 Name_1 和 Name_2(按 code_1 或按 code_2)创建一个表 但不仅仅是一个简单的查询,其中的名称不是 XXX 或 YYY,而是来自 FK 的名称。像这样:

ID   code_1    code_2
=======================
1    Name_1    Name_2
3    Name_2    Name_1

我试过了,但我不知道如何用 Name_1 替换 XXX:

SELECT Table1.ID, Table1.code_1, Table1.code2 FROM MyDB.Table1
WHERE (code_1=XXX and code_2 =YYY) or (code_2=XXX and code_1 =YYY)

非常感谢!

【问题讨论】:

  • 为什么答案只有两行?你不只是用他们的名字替换代码。你在干嘛?请详细说明答案中何时出现一行。 (你必须告诉我们你在总结/标记为“组合”。)理想情况下,完成这个句子模板:row (id,code_1,code_2) is in the answer when (f.id,f.code_1,f.code_2)在第一和 (s1.code,s1.name) & (s2.code,s2.name) 在第二和 id = f.id 和 code_1 = s1.name 和 code_2 = s2.name 和 s1.name = f.code_1 和 s2.name = f.code_2 和 ..."
  • PS 重新阅读 SQL JOIN。给定别名 a 和 b 的两个表的连接是连接来自 a 的行和来自 b 的行的行。 (句子模板 AND 导致 SQL 查询 JOIN、ON、WHERE 或 AND。)
  • PS 请阅读minimal reproducible example 并采取行动。不提供任何信息,即与回答您的问题相关的信息,会使您的问题偏离主题。
  • 您的编辑不清楚。 “简单查询”是另一个标签,不是明确的描述。 “不仅仅是一个简单的查询”是另一个标签。使用足够的单词和句子来清楚地解释。 (一个就足够了:我之前要求的句子模板又名 谓词。)(您的解释必须仅说明示例输出中的 ids 1 和 3。)
  • 也许你想说你想要看起来像一行 First 的唯一行,它在 {YYY,XXX} 中都有 code_1 和 code_2 但每个代码都被其名称替换? PS 如果一个表 (key,...,x_1,x_2) 可以替换为 (key,...,,n,x) 或 (key,...,x) 那么它通常应该是。否则查询和更新是不必要的复杂。例如,您真正需要的第一个表可能是 (id,n,code),而您真正需要的结果是 (id,name)。

标签: mysql sql join foreign-keys


【解决方案1】:

要获得包含两个表的结果,您可以使用:

SELECT id FROM table1
INNER JOIN table2 ON CODE = code_1
UNION ALL
SELECT table2.name Name1
FROM table2
INNER JOIN table1 ON CODE = code_1
UNION ALL
SELECT table2.name Name2
FROM table2
INNER JOIN table1 ON CODE = code_2;

以上内容未经测试。如果有帮助,请告诉我。

有关 MySQL 的更多信息,您可以查看:https://www.w3schools.com/sql/

更新

【讨论】:

  • 是的,但只有一种情况 XXX 和 YYY 而不是 YYY 和 XXX
  • 需要知道表的含义才能进行查询。不需要知道约束。可以使用约束,例如将 1 行 1 列的表转换为一个值,或者省略 DISTINCT 或保留 ALL。但人们永远需要约束。
  • @Kate 我们应该如何处理“我遇到语法错误”?给出错误信息。谷歌错误信息。了解 UNION。
  • @P.Soutzikevich PS 别忘了 sqlfiddle.com。
  • 这是尽可能接近你想要的。尝试将 Name_1 和 Name_2 合并为 1 列,或更改您的概念架构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2014-06-12
  • 1970-01-01
  • 2016-08-18
相关资源
最近更新 更多