0

私は自分自身をトリッキーな状況に陥らせましたが、データベースの経験が限られているため、それから抜け出すことができませんでした。私のオフィスには他に3人の開発者がこれを見てもらいましたが、複数のクエリに頼らずにやりたいことを実行する方法を思いつくことはできませんでした。私はあなたが提供しなければならないかもしれないどんな助けにも本当に感謝します。

これが私のデータ構造の簡略化された見方です:

[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の数値を個別に(独自の列に)返すことができないようです。

2つのLEFTJOINSを実行し、UNIONを実行して、FULLJOINをシミュレートしようとしました。それは私が頭を包むことができない結果を返します。

私は、これらの最初の2つのクエリのそれぞれにVIEWSを使用し、STOREによってデータを引き出すためにSELECT FROMTHEVIEWを使用しようとしました。

私は明らかに何かが欠けています。

target_inventory番号とactual_inventory番号が関連付けられた一意のアイテムのリストを返すことができれば、アプリケーションコードの作業を大幅に節約できます。

データを再構築する必要がありますか?

4

2 に答える 2

1

すべてを同じリストに入れますか。それから私はそれをaで行い、フラグを持っているので、どれがで、何がであるかがUNION ALLわかります。actual_inventorytarget_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>>)

そして、あなたが持っているその2番目の質問。それを書くためのより良い方法でなければなりません。このように多分:

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>>
)

私があなたのデータベース図を正しく理解しているなら、あなたのクエリは正しく、あなたは2列に入れたい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 に答える