我正在使用PeeWee和MySQL。我有两个表需要一个完整的连接来保持左右两侧的记录。 MySQL不直接支持这个,但我使用了#34;方法2"在这个有用的artice - http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/中创建一个似乎适用于我的数据的Full Join SQL语句。 它需要一个" UNION ALL" " LEFT OUTER JOIN" " RIGHT OUTER JOIN",使用第二个结果集中重复数据的删除。
我在两个表中匹配备份磁带条形码。 的 SQL
SELECT * FROM mediarecall AS mr
LEFT OUTER JOIN media AS m ON mr.alternateCode = m.tapeLabel
UNION ALL
SELECT * FROM mediarecall AS mr
RIGHT OUTER JOIN media AS m ON mr.alternateCode = m.tapeLabel
WHERE mr.alternateCode IS NULL
然而,当我使用PeeWee将它带入我的python脚本时,我发现似乎没有JOIN.RIGHT_OUTER允许我重新创建这个SQL。我过去常常使用JOIN.LEFT_OUTER,但这是我第一次需要完全加入。
当然,我可以让PeeWee使用RawQuery(),但是如果可以的话,我喜欢让代码看起来更优雅。
有没有人设法重新创建MySQL和PeeWee的完全加入而不诉诸RawQuery?
我曾设想过以下内容(我知道这是无效的): -
left_media = (MediaRecall
.select()
.join(Media,JOIN.LEFT_OUTER,
on=(MediaRecall.alternateCode == Media.tapeLabel)
)
)
right_media = (MediaRecall
.select()
.join(Media,JOIN.RIGHT_OUTER,
on=(MediaRecall.alternateCode == Media.tapeLabel)
)
)
.where(MediaRecall.alternateCode >> None) # Exclude duplicates
all_media = ( left_media | right_media) # UNION of the 2 results, which I
# can then use .where(), etc on
答案 0 :(得分:0)
您可以添加对右外部的支持:
from peewee import JOIN
JOIN['RIGHT_OUTER'] = 'RIGHT OUTER'
然后您可以使用JOIN.RIGHT_OUTER
。