このquerysの目的は、アイテムの「同じ」タイプの4つの異なるバリアントの各一意のID(LUID_NO)を数えることです。 期待どおりに動作します。
私の質問には、このクエリを簡略化したり別の方法で書いたりできますか?
私はそれを見ると、はるかに簡単な方法でそれを書くことはおそらく可能であるという感覚を揺さぶることはできません。SQLを簡略化することは可能ですか?
SELECT
(SELECT COUNT(DISTINCT ICL.LUID_NO)
FROM L2000.ITEM_CARRIER IC
INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID
INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO
INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX
INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID
WHERE IC.PV_ID = 'B2'
AND IP.BLOCK_CODE IS NULL
AND IUD.UOM_QTY = ICL.PHYSIC_QTY
AND IUD.UNIT_DEF_ID = 'LU'
AND IC.STORER_ID = 'PG'
AND ICL.PHYSIC_QTY > 0
AND I.ITEM_DESC LIKE '#%'
AND I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE')
)AS B2_PALLETS,
(SELECT COUNT(DISTINCT ICL.LUID_NO)
FROM L2000.ITEM_CARRIER IC
INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID
INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO
INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX
INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID
WHERE IC.PV_ID = 'B3'
AND IP.BLOCK_CODE IS NULL
AND IUD.UOM_QTY = ICL.PHYSIC_QTY
AND IUD.UNIT_DEF_ID = 'LU'
AND IC.STORER_ID = 'PG'
AND ICL.PHYSIC_QTY > 0
AND I.ITEM_DESC LIKE '#%'
AND I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE')
)AS B3_PALLETS,
(SELECT COUNT(DISTINCT ICL.LUID_NO)
FROM L2000.ITEM_CARRIER IC
INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID
INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO
INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX
INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID
WHERE IC.PV_ID = 'B2'
AND IP.BLOCK_CODE IS NOT NULL
AND IUD.UNIT_DEF_ID = 'LU'
AND IC.STORER_ID = 'PG'
AND ICL.PHYSIC_QTY > 0
AND I.ITEM_DESC LIKE '#%'
AND I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE')
)AS BLOCKED_B2_PALLETS,
(SELECT COUNT(DISTINCT ICL.LUID_NO)
FROM L2000.ITEM_CARRIER IC
INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID
INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO
INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX
INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID
WHERE IC.PV_ID = 'B3'
AND IP.BLOCK_CODE IS NOT NULL
AND IUD.UNIT_DEF_ID = 'LU'
AND IC.STORER_ID = 'PG'
AND ICL.PHYSIC_QTY > 0
AND I.ITEM_DESC LIKE '#%'
AND I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE')
)AS BLOCKED_B3_PALLETS
FROM L2000.ITEM_CARRIER
WHERE ROWNUM = 1
サブクエリをスキップし、左の代わりに参加します。また、条件式を使用して条件付き集計を行うこともできます。 – jarlh
サブクエリはメインクエリとは関係ないので、 'FROM L2000.ITEM_CARRIER WHERE ROWNUM = 1'の代わりに、' FROM DUAL'を開始することもできます。 –
'ITEM_ID'に' ITEM'と 'ITEM_CARRIER'と' ITEM_UNITS_DEFINITION'を参加させます。なぜITEM_PROPERTYでもいいのですか?そのテーブルは 'ITEM_ID'を持っていませんか?テーブルがどのように関連しているかを示して説明すると、役立つでしょう。例えばPV_IDとは何ですか? –