【问题标题】:How do I write a SQLite query that pulls information from two tables while cross referencing a third?如何编写一个 SQLite 查询,从两个表中提取信息,同时交叉引用第三个表?
【发布时间】:2012-04-05 20:14:35
【问题描述】:

我让自己陷入了一个棘手的境地,并且发现自己在数据库经验有限的情况下无法摆脱困境。我办公室的其他三位开发人员对此进行了研究,但我们中没有人能够在不诉诸多个查询的情况下想出一种方法来完成我想做的事情。非常感谢您提供的任何帮助。

这是我的数据结构的简化视图:

[REPORTS]
store_number
item
actual_inventory

[STORES]
store_number
store_attribute1
store_attribute2
store_attribute3

[PLANS]
store_attribute1
store_attribute2
store_attribute3
item
target_inventory

给定一个 store_number,我需要能够返回所有项目,actual_inventory 和 target_inventory。

难度:[REPORTS] 中的某些项目不在 [PLANS] 中,反之亦然。

这将返回商店的所有 [REPORTS] 项:

SELECT * 
FROM `REPORTS`
WHERE 
`store_number` = <<SOME NUMBER>>

这将返回商店的所有 [PLANS] 商品:

SELECT * 
FROM `PLANS`
WHERE 
`store_attribute1` =  (SELECT `store_attribute1` FROM `STORES` WHERE `number` = <<SOME NUMBER>>)
and `store_attribute2` = (SELECT `store_attribute2` FROM `STORES` WHERE `number` = <<SOME NUMBER>>)
and `store_attribute3` = (SELECT `store_attribute3` FROM `STORES` WHERE `number` = <<SOME NUMBER>>)

我只是不知道如何组合它们!如果我执行 UNION,我似乎无法单独返回 _inventory 数字(在它们自己的列中)。

我尝试通过执行两个 LEFT JOIN 和一个 UNION 来模拟 FULL JOIN。这会返回我无法理解的结果。

我什至尝试对前两个查询中的每一个都使用 VIEWS 并从 VIEW 中选择以通过 STORE 提取数据。

我显然错过了一些东西。

如果我可以返回具有关联的 target_inventory 和 actual_inventory 编号的唯一项目列表,它将在我的应用程序代码中节省大量工作。

我需要重新构造我的数据吗?

【问题讨论】:

    标签: database sqlite join


    【解决方案1】:

    您是否希望所有内容都在同一个列表中。然后我会用UNION ALL 来做,并有一个标志,这样你就知道哪个是actual_inventory,什么是target_inventory

    SELECT 
      item
      actual_inventory as inventory,
      1 as isActual
    FROM `REPORTS`
    WHERE 
    `store_number` = <<SOME NUMBER>>
    UNION ALL
    SELECT 
      item
      target_inventory AS inventory,
      0 as isActual
    FROM `PLANS`
    WHERE 
    `store_attribute1` =  (SELECT `store_attribute1` FROM `STORES` WHERE `number` = <<SOME NUMBER>>)
    and `store_attribute2` = (SELECT `store_attribute2` FROM `STORES` WHERE `number` = <<SOME NUMBER>>)
    and `store_attribute3` = (SELECT `store_attribute3` FROM `STORES` WHERE `number` = <<SOME NUMBER>>)
    

    还有第二个问题。它必须是一种更好的写法。可能是这样的:

    SELECT 
          item
          target_inventory AS inventory,
          0 as isActual
    FROM `PLANS` as p
    WHERE EXISTS
    (
        SELECT
            NULL
        FROM
            STORES as s
        WHERE
            s.store_attribute1=p.store_attribute1
            and s.store_attribute2=p.store_attribute2
            and s.store_attribute3=p.store_attribute3
            AND s.number = <<SOME NUMBER>>
    )
    

    如果我理解您的数据库图正确,您的查询正确,并且您希望在两列中有 target_inventoryactual_inventory。为什么你不能这样做?

    SELECT
        STORES.store_number,
        PLANS.target_inventory,
        REPORTS.actual_inventory
    FROM
        STORES
        LEFT JOIN REPORTS
            ON STORES.store_number=REPORTS.store_number
        LEFT JOIN PLANS
            ON STORES.store_attribute1=PLANS.store_attribute1
            AND STORES.store_attribute2=PLANS.store_attribute2
            AND STORES.store_attribute3=PLANS.store_attribute3
    WHERE
        STORES.store_number=<<SOME NUMBER>>
    

    【讨论】:

    • @PrestonFitzgerald :如果您认为答案很好,请记得点赞。它给了我们所有温暖模糊的感觉:P
    • 你的第一个例子是正确的。我只需要调整我的应用程序代码。您在那里进行的最后一次编辑不太有效,因为它与项目不匹配。实际上,它显示了所有项目的组合,我相信。
    • 我很想投票,但不幸的是我缺少代表。不过,非常感谢您的帮助,先生。非常感谢。
    • 没问题。很高兴为您提供帮助:P
    【解决方案2】:

    这似乎会拉回你需要的所有关系

    SELECT 
    
        `REPORTS`.`item` as `Item Number`, 
        `REPORTS`.`actual_inventory` as `Inventory`, 
        `PLANS`.`target_inventory` as `Target Inventory`
    
    FROM `REPORTS` as `r`, `STORES` as `s`, `PLANS` as `p`
    WHERE `r`.`store_number` = `s`.`store_number`
    AND `r`.`item` = `p`.`item`
    AND `s`.`store_attribute1` = `p`.`store_attribute1`
    AND `s`.`store_attribute2` = `p`.`store_attribute2`
    AND `s`.`store_attribute3` = `p`.`store_attribute3`
    

    如果这不起作用,也许是这个?

    SELECT
      `REPORTS`.`item` as `Item`, `REPORTS`.`actual_inventory`, `PLANS`.`target_inventory`
    FROM
      `REPORTS`, `PLANS`
    WHERE
      `REPORTS`.`store_number` IN (
                                   SELECT `store_number` 
                                   FROM `STORES` 
                                   WHERE `store_attribute1` = `PLANS`.`store_attribute1`                                    
                                   AND`store_attribute2` = `PLANS`.`store_attribute2` 
                                   AND`store_attribute3` = `PLANS`.`store_attribute3`
                                  )
      AND `REPORTS`.`item` = `PLANS`.`item`
    

    ...我实际上不知道上面的查询是否会起作用。

    【讨论】:

    • 感谢您一如既往的投入,Cam。
    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2019-08-09
    相关资源
    最近更新 更多