我不知道是否会更快,但你可以给一个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其甲骨文 –