如何将第3个表包含在连接中,但如果该表包含可以连接的行,则不必担心?

时间:2015-02-03 02:42:37

标签: mysql join sqlite

我有一个规范化的数据库,其中表可能有或没有与其他相关表有关的信息。例如

  • 单词表

    • ID
  • 定义表

    • ID
    • foreignk(to word.id)
  • countryoforigin

    • ID
    • foreignk(to definition.id)

例如,在这里加入单词和定义表完全没有问题,但是如果单词条目可能有也可能没有countryoforigin,我怎么能/我应该加入countryoforigin? (这只是一个例子,但在同样的情况下我还有其他几个表。)

如果word.id在countryoforigin表中有相应的条目但是如果没有匹配的条目则根本不返回任何内容,则此查询有效。

select * from word, definition, countryoforigin where
word.id = definition.fk and
word.id = 11 and
countryoforigin.fk = definition.id;

分割查询并在countryoforigin表上单独执行一个单独的select操作,使用countryoforigin.foreignk上的select和definition.id作为值,会更好吗?

2 个答案:

答案 0 :(得分:1)

也许是这样的:

SELECT 
    *
FROM
    word
        INNER JOIN
    definition ON word.id = definition.fk
        LEFT JOIN
    countryoforigin ON countryoforigin.fk = definition.id
WHERE
    word.id = 11

答案 1 :(得分:1)

您描述的操作称为外连接。这是安德鲁(正确)答案的完整语法。 OUTER关键字是可选的语法糖。

SELECT * FROM word INNER JOIN definition ON word.id = definition.fk LEFT OUTER JOIN countryoforigin ON countryoforigin.fk = definition.id WHERE
word.id = 11

注意您可以指定左外连接或右外连接。对于左连接,将为连接表达式左侧表中的每一行生成结果行。对于右连接,将为连接表达式右侧表中的每一行生成结果行。

您可以使用左连接并翻转表格。