具有多个表outerjoin的

时间:2018-05-06 08:15:21

标签: python sqlalchemy flask-sqlalchemy

我有三张桌子。

User:
[
   user_id
   first_name
   last_name
]

Picture:
[
   filename
   picture_type // eg: painting, photograph
   painter
]

Comment
[
   user_id
   filename
   comment
]

我正在尝试查询当前用户未审核的所有文件名。

以下行返回在给定picture_type

中审核和评论的所有文件名
session.query(Picture.filename).outerjoin(Comment).filter(
                                       Picture.filename == Comment.filename,
                                       Picture.picture_type == 'photograph'
                                                        ).all()

,以下行返回给定picture_type

中的所有文件名
session.query(Picture.filename).outerjoin(Comment).filter(
                                       Picture.picture_type == 'photograph'
                                                        ).all()

我期待以下行会返回给定picture_type中未审核的文件名,但会返回一个空列表

session.query(Picture.filename).outerjoin(Comment).filter(
                                       Picture.filename != Comment.filename,
                                       Picture.picture_type == 'photograph'
                                                        ).all()

我在这里做错了吗?我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

我认为你的代码有语法错误。你错过了一个点吗?你写道:

session.query(Picture.filename)outerjoin(Comment).filter(
                                   Picture.filename == Comment.filename,
                                   Picture.picture_type == 'photograph'
                                                    ).all()

但它应该是这样的:

session.query(Picture.filename).outerjoin(Comment).filter(
                                   Picture.filename == Comment.filename,
                                   Picture.picture_type == 'photograph'
                                                    ).all()

其他部分也存在此问题

答案 1 :(得分:0)

我研究了Exclusive Join并找出了问题。

应该是无== Comment.filename ,而不是 Picture.filename!= Comment.filename

我修改了代码,如下面的代码,它现在正在运行。

session.query(Picture.filename).outerjoin(Comment).filter(
                                   None == Comment.filename,
                                   Picture.picture_type == 'photograph'
                                                    ).all()

问题是左外连接的结果表没有任何符合 left_field!= right_field 条件的行。生成的行符合 left_field == right_field None == right_field 条件,因为右表中的缺失值将标记为 null 结果表。

以下链接让我对这个主题有了很好的了解。

http://www.datasavantconsulting.com/roland/sql_excl.html

感谢所有人的帮助。

但是,我仍然愿意接受更好的建议!!!