Wpis z mikrobloga

Czolem Mirki,

Chciałbym dodać do tego małego query wynik innego query - chodzi o dodanie daty konkretnej transakcji z innej tabeli.

Poniższe query wyciąga dane z jednej tabeli Order header, chcialbym dodac date transakcji jesli takowa istnieje.

Łącznikiem jest orderid i referenceid

SELECT DISTINCT
OH.ORDER_ID,
OH.PURCHASE_ORDER,
OH.STATUS,
OH.CARRIER_ID,
TRUNC(OH.SHIPPED_DATE) AS "SHIPPED DATE",
TRUNC(OH.CREATION_DATE) AS "ORDER CREATION DATE",
OH.USER_DEF_TYPE_1,
OH.USER_DEF_NUM_2 AS EACHES,
OH.CONSIGNMENT,
OH.COUNTRY
FROM
V_ORDER_HEADER OH
LEFT JOIN V_INVENTORY_TRANSACTION IT
ON OH.ORDER_ID = IT.REFERENCE_ID
WHERE
TRUNC(OH.CREATION_DATE) >= '02-07-2021'
AND (OH.USER_DEF_TYPE_1='OMNI 3P'
OR OH.USER_DEF_TYPE_1='EMPLOYEE'
OR OH.USER_DEF_TYPE_1='E-COMMERCE')

Dodatkowe query którego wynik chciałbym dodać

SELECT X.DSTAMP FROM V_INVENTORY_TRANSACTION X WHERE X.REFERENCE_ID = OH.ORDER_ID AND X.CODE = 'Pick' AND X.FROM_LOC_ID LIKE 'PLB%'
Dodanie tego do warunków oczywiście ogranicza mi wyniki by wszystkie warunki były spełnione. Chciałbym by pokazywało ORDERID nawet gdy X.DSTAMP jest null.

Pozwoli mi to śledzic zamowienia ktore przeszly pewien etap processu, a które nie zostały zakończone.

#sql #kiciochpyta #pomocy #praca
  • 8
  • Odpowiedz
@dr_rip: Użyj LEFT OUTER JOIN, wtedy bierze wszystko z lewej tabeli i łączy z tym z czym się da z prawej, a jak się nie da, to dla pól z prawej tabeli wyświetla NULL.
  • Odpowiedz
@Pipok: Dzieki za odpowiedz. Nie wiem czy dobrze zrozumialem, bo wyniki dalej sa ograniczone tylko do tych ktorych data moze zostac pokazana:

SELECT DISTINCT
OH.ORDER_ID,
OH.PURCHASE_ORDER,
OH.STATUS,
OH.CARRIER_ID,
TRUNC(OH.SHIPPED_DATE) AS "SHIPPED DATE",
TRUNC(OH.CREATION_DATE) AS "ORDER CREATION DATE",
TRUNC(IT.DSTAMP),
OH.USER_DEF_TYPE_1,
OH.USER_DEF_NUM_2 AS EACHES,
OH.CONSIGNMENT,
OH.COUNTRY
FROM
V_ORDER_HEADER OH
LEFT OUTER JOIN V_INVENTORY_TRANSACTION IT
ON OH.ORDER_ID = IT.REFERENCE_ID
WHERE
TRUNC(OH.CREATION_DATE) = '08-07-2021'
AND (OH.USER_DEF_TYPE_1='OMNI 3P'
OR OH.USER_DEF_TYPE_1='EMPLOYEE'
OR OH.USER_DEF_TYPE_1='E-COMMERCE')
AND IT.DSTAMP IN (SELECT
  • Odpowiedz
Warunek WHERE ogranicza widzialność tylko do tych rekordów które posiadają wartości porównywalne z tymi z warunku. Do każdego pola z WHERE które może zwrócić NULL powinieneś dodać "OR nazwapola IS NULL" wtedy zobaczysz to co potrzebujesz.
  • Odpowiedz
(...)AND (IT.DSTAMP IN (SELECT X.DSTAMP FROM VINVENTORYTRANSACTION X WHERE X.REFERENCEID = OH.ORDERID AND CODE = 'Pick' AND FROMLOCID LIKE 'PLB%') OR IT.DSTAMP IS NULL);

...jeśli dobrze rozumiem konstrukcję tego zapytania.
  • Odpowiedz
@Pipok: Może zechcesz jeszcze spojrzeć, bo mimo dopisania by pokazywał wyniki gdzie sub query nie zwróci wartości ogranicza wyniki. Pokazuje Zamówienia gdzie transakcja miala miejsce i może pokazać datę.

2540 recordow bez subquery do 1330 z subquery.

SELECT DISTINCT
OH.ORDER_ID,
OH.PURCHASE_ORDER,
OH.STATUS,
OH.CARRIER_ID,
TRUNC(OH.SHIPPED_DATE) AS "SHIPPED DATE",
TRUNC(OH.CREATION_DATE) AS "ORDER CREATION DATE",
TRUNC(IT.DSTAMP) "ORDER DELIVERED TO EXPEDITION",
OH.USER_DEF_TYPE_1,
OH.USER_DEF_NUM_2 AS EACHES,
OH.CONSIGNMENT,
OH.COUNTRY
FROM
V_ORDER_HEADER OH
LEFT OUTER JOIN V_INVENTORY_TRANSACTION IT
  • Odpowiedz
@Pipok: Juz sobie poradzilem full joinem z ograniczeniem warunkow w subquery.

Dzieki wielkie za pomoc. Udanego weekendu!

SELECT DISTINCT
OH.ORDER_ID,
OH.PURCHASE_ORDER,
OH.STATUS,
OH.CARRIER_ID,
TRUNC(OH.SHIPPED_DATE) AS "SHIPPED DATE",
TRUNC(OH.CREATION_DATE) AS "ORDER CREATION DATE",
TRUNC(Y.MOVE_TO_EXP) AS "MOVED TO EXPEDITION",
OH.USER_DEF_TYPE_1,
OH.USER_DEF_NUM_2 AS EACHES,
OH.CONSIGNMENT,
OH.COUNTRY
FROM
V_ORDER_HEADER OH
FULL JOIN (SELECT X.REFERENCE_ID AS "REFERENCE_ID", X.DSTAMP AS "MOVE_TO_EXP" FROM V_INVENTORY_TRANSACTION X WHERE X.CODE = 'Pick' AND X.FROM_LOC_ID LIKE 'PLB%') Y
ON OH.ORDER_ID = Y.REFERENCE_ID
  • Odpowiedz