您可以使用数据透视表:
SELECT *
FROM your_table
PIVOT (MAX(value) FOR mycode IN ('AAA' AS AAA, 'BBB' AS BBB)
哪位能给:
ORDERNO AAA BBB
------- --- ---
1234 11 PPP
4732 11
5555 PPP
然后,你可以这样做:
SELECT *
FROM (
SELECT *
FROM your_table
PIVOT (MAX(value) FOR mycode IN ('AAA' AS AAA, 'BBB' AS BBB)
)
WHERE AAA MEMBER OF listFilters
AND BBB MEMBER OF listFilters;
哪样给:
ORDERNO AAA BBB
------- --- ---
1234 11 PPP
替代:
您还可以使用COLLECT
aggregation function创造价值的收集和使用SUBMULTISET
operator做了一组对比:
SELECT OrderNo
FROM (
SELECT OrderNo,
CAST(COLLECT(value) AS your_listFilter_Type) AS vals
FROM your_table
WHERE myCode IN ('AAA', 'BBB')
GROUP BY OrderNo
)
WHERE listFilters SUBMULTISET OF vals;
替代2:
SELECT orderno, mycode, value
FROM (
SELECT t.*,
CAST(
COLLECT(
CASE WHEN mycode IN ('AAA', 'BBB') THEN value END
) OVER (PARTITION BY OrderNo)
AS your_listFilter_type
) AS vals
FROM your_table t
)
WHERE 1 = 1 -- Some conditions
AND listFilters SUBMULTISET OF vals
AND 2 = 2; -- Some more conditions
为什么我的逻辑让我失望?
您不限制子查询与外部查询具有相同的OrderNo
。
SELECT *
FROM your_table t
WHERE EXISTS(SELECT 1
FROM your_table x
WHERE x.orderno = t.orderno
AND x.mycode = 'AAA'
AND x.value MEMBER OF listFilters)
AND EXISTS(SELECT 1
FROM your_table x
WHERE x.orderno = t.orderno
AND x.mycode = 'BBB'
AND x.value MEMBER OF listFilters);
然而,这将潜在地做3次表扫描,而任一的上述选项将仅做一个单一表扫描。
来源
2017-02-15 12:19:48
MT0
OK ty。让我玩这个一些。我的声明是我的where子句中“AND”声明的一部分。我还有其他的过滤功能,我省略了这个问题。 – PrivateJoker
@JDS使用'COLLECT'解析函数(而不是聚集),这应该让你输出在相同的结构中的数据在另一个替代增补 – MT0