【问题标题】:unexpected LEFT OUTER JOIN behaviour in SQLITESQLITE 中意外的 LEFT OUTER JOIN 行为
【发布时间】:2014-11-21 14:20:31
【问题描述】:

我在 SQLITE 中有两个表

“端口”是

ticker  weight
abc     1
bcd     2
cde     3

“bench2”是

ticker  weight
abc     3
bcd     2
cde     1

我正在尝试学习如何在 SQLITE 中使用外连接。从 LEFT OUTER JOIN 开始,如下所示

SELECT * FROM port LEFT OUTER JOIN bench2 ON port.ticker = bench2.ticker;

我得到结果

ticker  weight  ticker  weight
abc      3      NULL    NULL
bcd      2      bcd     2

我希望看到的时候

ticker  weight weight
abc       1       3
bcd       2       2
cde       3       1

我做错了什么,我将如何获得我想要的结果?

如果可能,第二个问题 - 我怎样才能获得额外的一行

ticker  weight weight
abc       1       3
bcd       2       2
cde       3       1
def       NULL    3

如果“bench2”有多余的行,则在结果表中,

ticker  weight
abc     3
bcd     2
cde     1
def     3

port 保持不变。

【问题讨论】:

  • 修正问题,使表名和列名始终一致地使用。
  • 应该在您的结果中获得两个 ticker 和两个 weight 列,但如果您确实获得了您使用数据和查询描述的结果行,那么SQLite 出了问题。我更倾向于相信您的数据与您所说的不同,或者您可能执行了不同的查询。
  • 使用 USING 和外连接:sqlfiddle.com/#!5/b09132/2
  • 谢谢@Wiseguy。您的代码有效,但我自己的代码无效。我使用最近下载的 pycharm 版本作为我的 IDE。不要认为这应该有任何影响,但会检查。

标签: sql join sqlite


【解决方案1】:

对结果进行逆向工程使我得出结论,您的数据与您所说的不同。你似乎有这个:

端口:

ticker  weight
abc     3
bcd     2
... (no other rows)

板凳2:

ticker  weight
bcd     2
... maybe other rows, but none having ticker = 'abc'

对于列,当您执行除NATURAL JOIN 之外的任何连接时,每个连接表中的每一列都有一个结果列,包括存在同名列时,包括出现在加入条件。您可以限制哪些列出现在最终查询结果中,和/或您可以通过在选择列表中指定您想要的别名来为它们分配首选别名。

【讨论】:

    【解决方案2】:

    这样的事情怎么样?

    SELECT table2.ticker,
           table1.weight,
           table2.weight
    FROM   table2
           LEFT OUTER JOIN table1
                        ON table1.ticker = table2.ticker  
    

    【讨论】:

    • 主要问题不是结果中有哪些列,而是哪些
    • 我相信这个答案中的查询给出了当时问题中预期的输出。前提是表中的数据是当时所说的那样。如果不是您需要的,我很抱歉。
    • 除了选择结果列的子集外,此答案中的查询与问题中的查询相同。如果问题中提出的查询确实产生了那里描述的结果,那么这个答案中的查询不会产生预期的结果,因为列选择不是主要问题 .查看返回了哪些行,以及每行的内容。
    猜你喜欢
    • 2012-06-21
    • 2010-09-29
    • 2010-12-15
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2020-08-31
    • 2013-03-10
    相关资源
    最近更新 更多