2017-11-25 11 views
0

warehousewarehouse_orderというテーブルとwarehouse_fulfillmentというテーブルの3つのテーブルがある場合。倉庫順序は、倉庫管理者によって作成された当初は、0フルフィルメントレコードを持っていなかった/ステータスを拒否し、そして唯一の成功状態(それが行われます)で、多くのwarehouse_fulfillmentレコードを持つことができている:私は上記のレコードを照会する2つのテーブルと3番目のテーブルを条件付きの列として結合する

-- Warehouse 
+---------------------------------------+-----------+----------+ 
| id         | name  | location | 
+---------------------------------------+-----------+----------+ 
| 9bcae08e-ad36-4d97-b9ec-4857714e902a | "big"  | "MLB" | 
+---------------------------------------+-----------+----------+ 
| b442e783-4725-41e9-af83-f75004ee1b38 | "bigger" | "MLB" | 
+---------------------------------------+-----------+----------+ 
| 986d5aa9-0523-42d8-b183-dfd546d3e682 | "biggest" | "MLB" | 
+---------------------------------------+-----------+----------+ 


-- Warehouse_order Table 
+---------------------------------------+--------------------------------------+--------+----------+ 
| id         | warehouse_id       | type | quantity | 
+---------------------------------------+--------------------------------------+--------+----------+ 
| 9cb99fd9-9e5e-4240-8162-d28747be01cd | b442e783-4725-41e9-af83-f75004ee1b38 | BN_100 | 100  | 
+---------------------------------------+-------------------------------------+--------+-----------+ 
| eceb0b5a-5afa-40e4-ac62-efb686e3bdae | 9bcae08e-ad36-4d97-b9ec-4857714e902a | BN_200 | 400  | 
+---------------------------------------+--------------------------------------+--------+----------+ 
| 13370467-cf0c-47f2-8fea-a215500607e6 | 986d5aa9-0523-42d8-b183-dfd546d3e68 | BN_300 | 10  | 
+---------------------------------------+--------------------------------------+--------+----------+ 


-- Warhouse_fulfillment Table 
+---------------------------------------+---------------------------------------+------------+ 
| id         | order_id        | status  | 
+---------------------------------------+---------------------------------------+------------+ 
| 8a69edde-2346-48b8-96d0-6c4e25527f38 | 9cb99fd9-9e5e-4240-8162-d28747be01cd | "FAILLED" | 
+---------------------------------------+---------------------------------------+------------+ 
| a2006a64-9bdc-4bfa-ba14-a44769aeb4a2 | 9cb99fd9-9e5e-4240-8162-d28747be01cd | "REJECTED" | 
+---------------------------------------+---------------------------------------+------------+ 
| bf0aa1fc-6dfc-4fd0-ba20-be101b1985d1 | 9cb99fd9-9e5e-4240-8162-d28747be01cd | "FAILED" | 
+---------------------------------------+---------------------------------------+------------+ 
| 48c7d747-2f9b-4535-8f27-210a43cf5c30 | 9cb99fd9-9e5e-4240-8162-d28747be01cd | "SUCCESS" | 
+---------------------------------------+---------------------------------------+------------+ 
| 7f8e18c9-4322-428a-9370-9ecd1c5ef286 | 13370467-cf0c-47f2-8fea-a215500607e6 | "FAILED" | 
+---------------------------------------+---------------------------------------+------------+ 

+--------------------------------------+-----------+----------+---------------------------------------+------------+----------------+--------------------------------------+ 
| id         | name  | location | order_id        | order_type | order_quantity | fulfillment_id      | 
+--------------------------------------+-----------+----------+---------------------------------------+------------+----------------+--------------------------------------+ 
| 9bcae08e-ad36-4d97-b9ec-4857714e902a | "big"  | "MLB" | eceb0b5a-5afa-40e4-ac62-efb686e3bdae | "BN_100" | 100   | NULL         | 
+--------------------------------------+-----------+----------+---------------------------------------+------------+----------------+--------------------------------------+ 
| b442e783-4725-41e9-af83-f75004ee1b38 | "bigger" | "MLB" | 9cb99fd9-9e5e-4240-8162-d28747be01cd | "BN_200" | 400   | 48c7d747-2f9b-4535-8f27-210a43cf5c30 | 
+--------------------------------------+-----------+----------+---------------------------------------+------------+----------------+--------------------------------------+ 
| 986d5aa9-0523-42d8-b183-dfd546d3e682 | "biggest" | "MLB" | 13370467-cf0c-47f2-8fea-a215500607e6 | "BN_300" | 10    | NULL         | 
+--------------------------------------+-----------+----------+---------------------------------------+------------+----------------+--------------------------------------+ 

注文に複数の失敗したステータスがある場合は、繰り返し行がないとこれを実行できませんでした。

+0

フルフィルメントテーブルに重大な欠陥があります。最新のステータスを確実に知るために、追加されたステータスごとにタイムスタンプが保存されている必要があります。 –

答えて

0

SELECT DISTINCTを試しましたか?選択リストに(重複を引き起こす)ステータス列がないので、これは機能するはずです。

SELECT DISTINCT W.id, W.name, W.location, WO.id order_id, WO.type order_type, WO.quantity order_quantity, WF.id fulfillment_id 
FROM warehouse W 
    LEFT JOIN warehouse_order WO ON W.id = WO.warehouse_id 
    LEFT JOIN warehouse_fulfillment WF on WF.order_id = WO.id 

そうでなければ、私はSQLが何のためにあるのかDBMSを知る必要があるだろうが、私が働いてきたすべての香りは、あなたがベースだけの最初のレコードを取ることができるようにパーティションに/オーダー結果をランク付けするいくつかの方法があります

最新のレコードを取得するには、日付DESCなどで注文する方がよいでしょう。

0

フルフィルメントテーブル内で、タイムスタンプなどの「最新のステータス」を決定する信頼できる方法がない場合は、可能なステータス値の優先順位に達するために任意の方法を選択する必要があります。以下では、over clauseの中にcase expressionを使用しました。そのため、そのステータスが注文のために存在する場合、「成功」は行番号1を取得します。その列の他の可能な値に適したケース式を調整します。

ロー番号を含むサブクエリがメインクエリにジョインされている場合、ジョインにはand rn=1が含まれているため、注文ごとにフルフィルメントローだけが可能です。

サンプルデータにはウェアハウス行がありませんので、左結合を使用しなければならないことに注意してください。しかし、実際のdbの内部結合になると予想しています。

SQL Fiddle Demo

CREATE TABLE Warehouse 
    (ID varchar(36), Name varchar(9), Location varchar(5)) 
; 

INSERT INTO Warehouse 
    ("id", "name", "location") 
VALUES 
    ('9bcae08e-ad36-4d97-b9ec-4857714e902a', 'big', 'MLB'), 
    ('b442e783-4725-41e9-af83-f75004ee1b38', 'bigger', 'MLB'), 
    ('986d5aa9-0523-42d8-b183-dfd546d3e682', 'biggest', 'MLB') 
; 


CREATE TABLE Warehouse_order 
    (ID varchar(36), Warehouse_id varchar(36), type varchar(6), quantity int) 
; 

INSERT INTO Warehouse_order 
    ("id", "warehouse_id", "type", "quantity") 
VALUES 
    ('9cb99fd9-9e5e-4240-8162-d28747be01cd', 'b442e783-4725-41e9-af83-f75004ee1b38', 'BN_100', 100), 
    ('eceb0b5a-5afa-40e4-ac62-efb686e3bdae', '9bcae08e-ad36-4d97-b9ec-4857714e902a', 'BN_200', 400), 
    ('13370467-cf0c-47f2-8fea-a215500607e6', '986d5aa9-0523-42d8-b183-dfd546d3e68', 'BN_300', 10) 
; 


CREATE TABLE Warehouse_fulfillment 
    (ID varchar(36), Order_id varchar(36), Status varchar(10)) 
; 


INSERT INTO Warehouse_fulfillment 
    ("id", "order_id", "status") 
VALUES 
    ('8a69edde-2346-48b8-96d0-6c4e25527f38', '9cb99fd9-9e5e-4240-8162-d28747be01cd', 'FAILLED'), 
    ('a2006a64-9bdc-4bfa-ba14-a44769aeb4a2', '9cb99fd9-9e5e-4240-8162-d28747be01cd', 'REJECTED'), 
    ('bf0aa1fc-6dfc-4fd0-ba20-be101b1985d1', '9cb99fd9-9e5e-4240-8162-d28747be01cd', 'FAILED'), 
    ('48c7d747-2f9b-4535-8f27-210a43cf5c30', '9cb99fd9-9e5e-4240-8162-d28747be01cd', 'SUCCESS'), 
    ('7f8e18c9-4322-428a-9370-9ecd1c5ef286', '13370467-cf0c-47f2-8fea-a215500607e6', 'FAILED') 
; 

クエリ1

select 
    o.*, w.name, s.status, s.rn 
from Warehouse_order o 
left join Warehouse w on o.Warehouse_id = w.id 
left join (
     select id, order_id, status 
      , row_number() over(partition by order_id 
           order by case when status = 'SUCCESS' then 1 
              when status = 'FAILED' then 2 
              when status = 'REJECTED' then 3 
              else 4 end) as rn 
     from Warehouse_fulfillment 
    ) s on o.id = s.Order_id and rn=1 

Results

|         id |       warehouse_id | type | quantity | name | status |  rn | 
|--------------------------------------|--------------------------------------|--------|----------|--------|---------|--------| 
| eceb0b5a-5afa-40e4-ac62-efb686e3bdae | 9bcae08e-ad36-4d97-b9ec-4857714e902a | BN_200 |  400 | big | (null) | (null) | 
| 9cb99fd9-9e5e-4240-8162-d28747be01cd | b442e783-4725-41e9-af83-f75004ee1b38 | BN_100 |  100 | bigger | SUCCESS |  1 | 
| 13370467-cf0c-47f2-8fea-a215500607e6 | 986d5aa9-0523-42d8-b183-dfd546d3e68 | BN_300 |  10 | (null) | FAILED |  1 | 
0

私はこれで完全にわからないんだけど、それはリク聞こえますあなたは非成功したレコードを気にしていないようだ、とだけがすることを保証があるので

select 
    w.id, w.name, w.location, 
    o.id as order_id, o.type as order_type, 
    o.quantity as order_quantity, 
    f.id as fulfillment_id 
from 
    warehouse w 
    join warehouse_order o on 
    w.id = o.warehouse_id 
    left join warhouse_fulfillment f on 
    o.id = f.order_id and 
    f.status = 'SUCCESS' 

:Eちょうど左が参加して「成功」状態でorder_fulfillmentテーブルに参加したいです「成功」履行記録であれば、重複は避けるべきです。

+0

これは動作しません。私が必要とするのは、 'status'が' success'であれば 'order_fulfillment' idを返し、そうでなければ' null'を返します。これは、指定された 'Warehouse-> Warehouse_order->それが実現したかどうか'返すクエリ 'fulfillment_id'を見ることができ、それがnullの場合、'満たされていないか、達成されていないか 'または'私はそれが成功したことを知っています。 – ke3pup

+0

それは面白いです...あなたのデータをあなたが列挙したやり方で嘲笑しました。しかたがない。それはショットの価値があった。 – Hambone

関連する問題