我不知道是否會更快,但你可以給一個JOIN基礎的方法了一槍
SELECT CON1.package_id
FROM (SELECT DISTINCT package_id
FROM EXT
WHERE ITEM_PARAM_ATTR_NAME = 'Charge code'
AND ITEM_PARAM_ATTR_VALUE = 'WDATRM'
) CON1
INNER
JOIN (SELECT DISTINCT package_id
FROM EXT
WHERE ITEM_PARAM_ATTR_NAME = 'Charge code'
AND ITEM_PARAM_ATTR_VALUE = 'WDA4RM'
) CON2
ON CON1.package_id = CON2.package_id
INNER
JOIN (SELECT DISTINCT package_id
FROM EXT
WHERE Priority > 299
) CON3
ON CON1.package_id = CON3.package_id
INNER
JOIN (SELECT DISTINCT package_id
FROM EXT
WHERE ITEM_PARAM_ATTR_NAME = 'Rate table rate'
AND ITEM_PARAM_ATTR_VALUE = '0.00000953'
) CON4
ON CON1.package_id = CON4.package_id
INNER
JOIN (SELECT DISTINCT package_id
FROM EXT
WHERE ITEM_PARAM_ATTR_NAME = 'Usage category group'
AND ITEM_PARAM_ATTR_VALUE = 'H'
) CON5
ON CON1.package_id = CON5.package_id
編輯:那第一個沒有工作。 INTERSECTS可能會像它一樣好。如果這個更好,我會感到驚訝,但也許。
SELECT DISTINCT package_id
FROM (SELECT MAX(CASE WHEN ITEM_PARAM_ATTR_NAME = 'Charge code'
AND ITEM_PARAM_ATTR_VALUE = 'WDATRM' THEN 1
ELSE 0
) OVER
(PARTITION BY package_id) CON1,
MAX(CASE WHEN ITEM_PARAM_ATTR_NAME = 'Charge code'
AND ITEM_PARAM_ATTR_VALUE = 'WDA4RM' THEN 1
ELSE 0
) OVER
(PARTITION BY package_id) CON2,
MAX(CASE WHEN Priority > 299 THEN 1
ELSE 0
) OVER
(PARTITION BY package_id) CON3,
MAX(CASE WHEN ITEM_PARAM_ATTR_NAME = 'Rate table rate'
AND ITEM_PARAM_ATTR_VALUE = '0.00000953' THEN 1
ELSE 0
) OVER
(PARTITION BY package_id) CON4,
MAX(CASE WHEN ITEM_PARAM_ATTR_NAME = 'Usage category group'
AND ITEM_PARAM_ATTR_VALUE = 'H' THEN 1
ELSE 0
) OVER
(PARTITION BY package_id) CON5,
CON1 + CON2 + CON3 + CON4 + CON5 AS ALLCON
FROM EXT
) TMP
WHERE ALLCON = 5;
歡迎EAV世界。 – lad2025
你正在使用哪些DBMS? –
@YellowBedwetter其甲骨文 –