ORACLE SQL How to implement a UNION clause but maintain the order of each SELECT
如何在两个
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | SELECT a.poclcdde, a.poclnpol, a.poclcdcl FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLCDCE = 0 AND POCLTPSG = '01' UNION SELECT a.poclcdde, a.poclnpol, a.poclcdcl FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLTPSG = '02' POCLCDDE POCLNPOL POCLCDCL ---------- ---------- ---------- 100 1000001 202153 100 5001021 216450 100 9000386 8078 100 9900633 250056 100 9900634 250056 100 9901720 562223 100 9901763 562223 200 1000001 202153 200 5001021 216450 |
在这种情况下,如何保证第一条记录来自query1,其余记录来自query2。
我可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | SELECT * FROM (SELECT a.poclcdde, a.poclnpol, a.poclcdcl, 1 AS TYPE FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLCDCE = 0 AND POCLTPSG = '01' UNION SELECT a.poclcdde, a.poclnpol, a.poclcdcl, 2 AS TYPE FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLTPSG = '02') ORDER BY TYPE POCLCDDE POCLNPOL POCLCDCL TYPE ---------- ---------- ---------- ---------- 200 1000001 202153 1 100 1000001 202153 1 100 9000386 8078 1 100 9900634 250056 2 100 9901720 562223 2 100 9901763 562223 2 200 5001021 216450 2 100 9000386 8078 2 100 5001021 216450 2 100 9900633 250056 2 |
我需要按此顺序交互每一行:以第一个查询为准。
谢谢
您要从同一张表中选择相同的列,因此您不需要两个查询,只需要一个带有相应
1 2 3 4 5 6 7 8 9 10 | SELECT poclcdde, poclnpol, poclcdcl FROM dtpocl WHERE poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND ( (pocltpsg = '01' AND poclcdce = 0) OR pocltpsg = '02' ) ORDER BY pocltpsg; |
更新:您说得到重复项,但是一旦使用
1 2 3 4 5 6 7 8 9 10 11 | SELECT poclcdde, poclnpol, poclcdcl FROM dtpocl WHERE poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND ( (pocltpsg = '01' AND poclcdce = 0) OR pocltpsg = '02' ) GROUP BY poclcdde, poclnpol, poclcdcl ORDER BY MIN(pocltpsg); |
您可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | SELECT * FROM (SELECT a.poclcdde, a.poclnpol, a.poclcdcl, 1 AS TYPE FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLCDCE = 0 AND POCLTPSG = '01' UNION SELECT a.poclcdde, a.poclnpol, a.poclcdcl, 2 AS TYPE FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLTPSG = '02' AND NOT EXISTS (SELECT NULL FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLCDCE = 0 AND POCLTPSG = '01') ) ORDER BY TYPE |
您可以将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | WITH cte AS ( SELECT a.poclcdde, a.poclnpol, a.poclcdcl, 1 AS TYPE FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLCDCE = 0 AND POCLTPSG = '01' UNION ALL SELECT a.poclcdde, a.poclnpol, a.poclcdcl, 2 AS TYPE FROM dtpocl a WHERE a.poclcdcl IN (216450, 562223, 250056, 202153, 8078) AND POCLTPSG = '02' ) SELECT poclcdde, poclnpol, poclcdcl FROM (SELECT t.*, ROW_NUMBER() OVER ( partition BY t.poclcdde, t.poclnpol, t.poclcdcl ORDER BY t.type) AS rn FROM cte t) WHERE rn = 1 ORDER BY TYPE |