【问题标题】:sqlite - python - full outer join with attaching a databasesqlite - python - 附加数据库的完全外连接
【发布时间】:2014-05-28 12:45:38
【问题描述】:

我在 2 个数据库中有 2 个表:

表格 call in history.db:

ROWID | ADDRESS | DATE 
1     | +98765  | 1396771532    
2     | +98765  | 1396771533    
3     | +98765  | 1396771534    
4     | +98765  | 1396771535    
5     | +98765  | 1396771536    
6     | +98765  | 1396771537    
7     | +98765  | 1396771538    
8     | +98765  | 1396771539    
9     | +98765  | 1396771510

表格 info in voices.db:

ID    | CALLID  | PATH       | CODE    
1     | 2       | voice1.m4a | 12234    
2     | 5       | voice2.m4a | 12234    
3     | 1       | voice4.m4a | 89765

首先,我做了一个附件:

conn = sqlite3.connect("history.db")
conn.row_factory = sqlite3.Row
cursor = conn.cursor()

cursor.execute("attach ? as voice", ("voices.db",))
conn.commit()

然后,我加入了 2 个表:

cursor.execute("SELECT * FROM call c JOIN (SELECT PATH, CALLID, CODE FROM voice.info WHERE CODE = ?) f ON c.ROWID = f.CALLID ORDER BY c.DATE", ("12234",))

所以,我得到了以下结果:

ROWID | ADDRESS | DATE       | PATH       | CALLID | CODE    
2     | +98765  | 1396771533 | voice1.m4a | 2      | 12234    
5     | +98765  | 1396771536 | voice2.m4a | 5      | 12234

但是,我需要一个完整的外部连接来获得类似的东西:

ROWID | ADDRESS | DATE       | PATH       | CALLID | CODE    
1     | +98765  | 1396771532 | NULL       | NULL   | NULL    
2     | +98765  | 1396771533 | voice1.m4a | 2      | 12234    
3     | +98765  | 1396771534 | NULL       | NULL   | NULL    
4     | +98765  | 1396771535 | NULL       | NULL   | NULL    
5     | +98765  | 1396771536 | voice2.m4a | 5      | 12234    
6     | +98765  | 1396771537 | NULL       | NULL   | NULL    
7     | +98765  | 1396771538 | NULL       | NULL   | NULL    
8     | +98765  | 1396771539 | NULL       | NULL   | NULL    
9     | +98765  | 1396771510 | NULL       | NULL   | NULL

我尝试了this,但出现... UNION do not have same number result columns ... 的错误。

我怎样才能有一个完整的外部联接?

我使用的是 Python 2.7,所以

目前不支持右连接和全外连接

【问题讨论】:

  • 您链接到的答案是正确的。展示你的尝试。
  • @CL - 我在使用条件从 voice.info 中选择时遇到问题,我的意思是我无法将我的代码与该答案匹配

标签: python-2.7 sqlite outer-join


【解决方案1】:

您的原始查询写得不好。像这样写:

SELECT c.*, i.* FROM CALL c
JOIN voice.info i ON i.CODE = ? AND c.ROWID = i.CALLID
ORDER BY c.DATE;

现在将其转换为您链接的答案中的完整外部连接是微不足道的:

SELECT c.*, i.* FROM CALL c
LEFT JOIN voice.info i ON c.ROWID = i.CALLID AND i.CODE = ?
UNION
SELECT c.*, i.* FROM voice.info i 
LEFT JOIN CALL c ON c.ROWID = i.CALLID
WHERE i.CODE = ?;

在您链接的答案中,他们使用UNION ALL,这会在结果集中保留重复项。我认为您不希望这样,因此我更喜欢使用UNION,它会删除重复项(所有列都相等的行)。

另外:写出所有列实际上比使用* 更好,但为了简洁起见,我没有在这里这样做。

【讨论】:

  • 我收到以下错误:Right and FULL OUTER JOINs are not currently supported
  • 谢谢,但我得到了 2 行,就像我在问题中提到的那样
  • 查询的第一部分返回什么? SELECT c.*, i.* FROM CALL c LEFT JOIN voice.info i ON c.ROWID = i.CALLID AND i.CODE = ?
  • 它也返回这 2 行。我认为UNION 在这里不能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2012-08-24
  • 2020-06-10
  • 1970-01-01
  • 2012-09-27
  • 2023-03-31
  • 2012-01-06
相关资源
最近更新 更多