【问题标题】:Selecting data from one table based upon matching values in another根据另一个表中的匹配值从一个表中选择数据
【发布时间】:2014-10-25 21:19:05
【问题描述】:

我正在尝试根据另一个表中的数据从一个表中选择数据。我的代码遵循以下提供的答案:Update SQLite table based on data in another table

但我无法让它产生我希望的结果。我的陈述如下:

c.execute("SELECT item1, item2, item3 FROM TableA WHERE xyz IS NULL AND item1 = (SELECT item1 FROM TableB) AND item2 = (SELECT item2 FROM TableB) AND item3 = (SELECT item3 FROM TableB)"

我正在尝试从 TableA 中选择所有匹配结果,其中 tableB 中的 item1、item2 和 item 3 与 TableA + 中的匹配结果,其中 TableA 的 xyz 值为 NULL。

*TableA*

item1  |  item2 |  item3     |  xyz

banana | apple  | pear       | NULL
carrot | potato | sausage    |  1
cat    | dog    | bird       | NULL
fish   | squid  | tortoise   |  4


*TableB*

item1  |  item2 |  item3

banana | apple  | pear
cat    | dog    | bird
fish   | squid  | tortoise
foo    | bar    | deadbeef

所以,我正在尝试选择:

banana, apple, pear 
cat, dog, bird

但我的语句只返回 tableB 中的第一个匹配项:

banana, apple, pear;并且不会继续搜索表 B 中的其余项目。

为什么会发生这种情况,可以解决吗?

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    我现在手头没有 SQLite,所以请原谅拼写错误...但是 inner join 不是很好的解决方案吗?

    c.execute("""SELECT item1, item2, item3 
                   FROM TableA JOIN TableB USING (item1,item2,item3)
                   WHERE xyz IS NULL")
    

    此连接将匹配相同 "triplet" (item1,item2,item3) 上的行。


    如果您的两个表只有三列 item1..3,您甚至可能想要自然连接

    c.execute("""SELECT item1, item2, item3 
                   FROM TableA NATURAL JOIN TableB
                   WHERE xyz IS NULL")
    

    这是对两个表中具有相同名称的隐式进行的内连接。 不过我不是这个的忠实粉丝,因为它可能会成为一个定时炸弹,准备在有人无意中在你的表中添加一些列的那一天爆炸......

    【讨论】:

    • 太棒了,谢谢(也提供链接和建议)。这两个例子都有效,但我想我会听从你的建议并坚持第一个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多