私は次のクエリを持っています。プロダクトIDを入力(2,4,5)とすると、私はそのリストに関連するkeyidを取得したい。それから私はそのキーIDに関連するすべての製品を取得したい。単一のSQLクエリ(依存結果)でCTEとSELECTを置き換えることは可能ですか
例:私はproductidを2,4,5として私のsprocへの入力として渡していますが、私は22,34,35,38(CTEの結果)としてkeyidを取得します。このキーは入力プロダクトリストにマッピングされます。このキー(CTEの結果)に基づいて、私はすべての製品がこのキーに関連付けられます。 keyid = 22に商品IDが2,4,5,8,9 &、keyid = 34などの商品名が2,4,5,23,45などの商品を持つようになりました。
上記の問題に対する以下の解決策。私はちょうど2つのテーブルが繰り返されているので、何とかこの解決法を改善することができるか、または単一のクエリでこの仕事を行うことができるかどうかを期待しています。
製品とproductkeymappingテーブルのWITH GetKey_CTE
AS
(
SELECT k.id, some other select statements
FROM KeyDim k
INNER JOIN KeyData kd on kd.id = k.id
INNER JOIN KeyProductMapping kpm on kpm.id = k.id and kpm.mkey = k.mkey
INNER JOIN Products p on p.productid = kpm.productid
and p.productid IN (2,4,5)
LEFT JOIN some more joins
WHERE clause conditions
)
SELECT cte.id as keyid, pn.productname, some other columns
FROM GetKey_CTE cte
INNER JOIN KeyProductMapping kpm on cte.id = kpm.id
INNER JOIN Products pn on pn.productid = kpm.productid
ORDER BY cte.id
データセット例:
Productsテーブルの場合:
productid name
1 car
2 bike
3 plane
4 bus
5 train
45 cycle
ProductKeyMappingテーブル
productid keyid
1 23
2 987
45 23
1 56
入力商品コードが1であると言う、最終的な結果はであるべきです:
keyid productid name
23 1 car
23 45 cycle
56 1 car
を見ているメインのステートメントに、我々があれば言うことができないことを移動'KeyProductsMapping'と' Products'テーブルへの2つの参照を避けることが可能です。 (共通のテーブル式は厳密には必要ではありません。同じクエリがインラインビューとして表示され、cte(またはインラインビュー)クエリにGROUP BYが含まれていないと仮定すると、別のSELECT。クエリが単一のSELECTで書き直される可能性がありますが、そのクエリは同じテーブル参照を持ちます... 'Products'と' KeyProductsMapping'テーブルへの2つの参照 – spencer7593
私には意味がありません:INNER JOIN Products pn on cte.productid = kpm.productid – Paparazzi
mymistake、私はそれを更新します、関係はマッピングテーブル – user2406618