0

我使自己陷入了一个棘手的境地,发现自己无法凭借有限的数据库经验摆脱困境。我在我的办公室让其他三个开发人员来看看这个,我们没有人能够想出一种方法来完成我想做的事情,而无需求助于多个查询。我非常感谢您提供的任何帮助。

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

[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] 项:

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 编号的唯一项目列表,它将在我的应用程序代码中节省大量工作。

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

4

2 回答 2

1

你想要所有在同一个列表中。然后我会用 a 做它UNION ALL并有一个标志,这样你就知道哪个是 theactual_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_inventory和。actual_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>>
于 2012-04-05T20:26:15.483 回答
0

这似乎会撤回您需要的所有关系

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`

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

于 2012-04-05T20:46:06.587 回答