从 oracle sql 查询输出中删除分区行
Removing Partitioned rows from oracle sql query output
我有以下查询
SELECT ROW_NUMBER() OVER ( PARTITION BY COLUMN1, COLUMN2, COLUMN3 ORDER BY COLUMN1, COLUMN2) AS ROW_NUM, COLUMN1, COLUMN2, COLUMN3
FROM (SUBQUERY)
GROUP BY COLUMN1, COLUMN2, COLUMN3
OUTPUT of above query:-
我需要执行等同于
的操作
IF (COLUMN2 == 'PQR' AND COLUMN3 IS NOT NULL)
THEN
"Delete whole partition from output having value A3 in column1"
解释:-
如果 COLUMN2 具有值 PQR
并且 COLUMN3 具有任何 DATE_TIME
(即 NOT NULL),则所有对应的 COLUMN1 值不应出现在查询输出中。
OUTPUT required is:-
我尽量表达清楚。让我知道是否需要进一步澄清我的问题。
NOTE:- I want to remove those rows only from output of the query not from actual table.
如果你想要 select query
那么你可以使用 NOT EXISTS
:
SELECT * FROM YOUR_TABLE T1
WHERE NOT EXISTS (SELECT 1 FROM YOUR_TABLE T2
WHERE T1.COLUMN1 = T2.COLUMN1
AND T2.COLUMN2 = 'PQR' AND T2.COLUMN3 IS NOT NULL);
您可以使用EXISTS
到delete
这样的记录如下:
DELETE FROM YOUR_TABLE T1
WHERE EXISTS (SELECT 1 FROM YOUR_TABLE T2
WHERE T1.COLUMN1 = T2.COLUMN1
AND T2.COLUMN2 = 'PQR' AND T2.COLUMN3 IS NOT NULL);
如果您使用子查询执行此操作,那么您可能需要使用 window 函数:
SELECT s.*
FROM (SELECT ROW_NUMBER() OVER ( PARTITION BY COLUMN1, COLUMN2, COLUMN3 ORDER BY COLUMN1, COLUMN2) AS ROW_NUM,
COLUMN1, COLUMN2, COLUMN3,
COUNT(CASE WHEN COLUMN2 = 'PQR' THEN COLUMN3 END) OVER (PARTITION BY COLUMN1) as cnt
FROM (SUBQUERY)
GROUP BY COLUMN1, COLUMN2, COLUMN3
) s
WHERE cnt = 0;
这会计算 COLUMN3
个值的数量,其中 COLUMN2 = 'PQR'
超过每个 COLUMN1
。然后 returns 只有此计数为 0
.
的行
这种方法的优点是它只评估一次子查询——如果它很复杂,这可能是性能上的胜利(超过 NOT EXISTS
)。
我有以下查询
SELECT ROW_NUMBER() OVER ( PARTITION BY COLUMN1, COLUMN2, COLUMN3 ORDER BY COLUMN1, COLUMN2) AS ROW_NUM, COLUMN1, COLUMN2, COLUMN3
FROM (SUBQUERY)
GROUP BY COLUMN1, COLUMN2, COLUMN3
OUTPUT of above query:-
我需要执行等同于
的操作IF (COLUMN2 == 'PQR' AND COLUMN3 IS NOT NULL)
THEN
"Delete whole partition from output having value A3 in column1"
解释:-
如果 COLUMN2 具有值 PQR
并且 COLUMN3 具有任何 DATE_TIME
(即 NOT NULL),则所有对应的 COLUMN1 值不应出现在查询输出中。
OUTPUT required is:-
我尽量表达清楚。让我知道是否需要进一步澄清我的问题。
NOTE:- I want to remove those rows only from output of the query not from actual table.
如果你想要 select query
那么你可以使用 NOT EXISTS
:
SELECT * FROM YOUR_TABLE T1
WHERE NOT EXISTS (SELECT 1 FROM YOUR_TABLE T2
WHERE T1.COLUMN1 = T2.COLUMN1
AND T2.COLUMN2 = 'PQR' AND T2.COLUMN3 IS NOT NULL);
您可以使用EXISTS
到delete
这样的记录如下:
DELETE FROM YOUR_TABLE T1
WHERE EXISTS (SELECT 1 FROM YOUR_TABLE T2
WHERE T1.COLUMN1 = T2.COLUMN1
AND T2.COLUMN2 = 'PQR' AND T2.COLUMN3 IS NOT NULL);
如果您使用子查询执行此操作,那么您可能需要使用 window 函数:
SELECT s.*
FROM (SELECT ROW_NUMBER() OVER ( PARTITION BY COLUMN1, COLUMN2, COLUMN3 ORDER BY COLUMN1, COLUMN2) AS ROW_NUM,
COLUMN1, COLUMN2, COLUMN3,
COUNT(CASE WHEN COLUMN2 = 'PQR' THEN COLUMN3 END) OVER (PARTITION BY COLUMN1) as cnt
FROM (SUBQUERY)
GROUP BY COLUMN1, COLUMN2, COLUMN3
) s
WHERE cnt = 0;
这会计算 COLUMN3
个值的数量,其中 COLUMN2 = 'PQR'
超过每个 COLUMN1
。然后 returns 只有此计数为 0
.
这种方法的优点是它只评估一次子查询——如果它很复杂,这可能是性能上的胜利(超过 NOT EXISTS
)。