oracle 表列值唯一 怎么实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 表列值唯一 怎么实现相关的知识,希望对你有一定的参考价值。
你这个情况,可以采用
序列号
+
触发器
的方式来处理。
SQL>
CREATE
SEQUENCE
test_sequence2
2
increment
by
1
--
每次递增1
3
start
with
1
--
从1开始
4
nomaxvalue
--
没有最大值
5
minvalue
1
--
最小值=1
6
NOCYCLE;
--
不循环
Sequence
created.
SQL>
CREATE
TABLE
test_create_tab2
(
2
id
INT,
3
val
VARCHAR(10),
4
PRIMARY
KEY
(id)
5
);
Table
created.
SQL>
CREATE
OR
REPLACE
TRIGGER
BeforeTestCreate2Insert
2
BEFORE
INSERT
ON
test_create_tab2
3
FOR
EACH
ROW
4
BEGIN
5
SELECT
test_sequence2.nextval
INTO
:new.id
FROM
dual;
6
END;
7
/
Trigger
created.
SQL>
INSERT
INTO
test_create_tab2(val)
VALUES
('NO
id');
1
row
created.
SQL>
INSERT
INTO
test_create_tab2(id,
val)
VALUES
(1,
'id
no
use');
1
row
created.
SQL>
SELECT
*
FROM
test_create_tab2;
ID
VAL
----------
--------------------
1
NO
id
2
id
no
use 参考技术A select
count(1)
from
xxx
where
yyy
is
null;
首先
yyyy
是nullable这样做才有意义,
如果是nullable
那么最快的是
建一个索引
create
index
ind1
on
xxx(yyy,1);
如下面的例子:
sql>
set
timing
on;
sql>
sql>
select
count(1)
from
tvol
where
owner
is
null;
count(1)
----------
0
elapsed:
00:00:02.89
sql>
sql>
create
index
ind1
on
tvol(owner,1);
index
created.
elapsed:
00:00:20.73
sql>
select
count(1)
from
tvol
where
owner
is
null;
count(1)
----------
0
elapsed:
00:00:00.00
Oracle SQL 从唯一行返回列值
【中文标题】Oracle SQL 从唯一行返回列值【英文标题】:Oracle SQL to return column values from unique rows 【发布时间】:2019-11-06 21:42:48 【问题描述】:我有一个包含多个子批次的单个批次的表格:
+--------+----------+
¦Batch +Sub-batch ¦
¦--------¦----------¦
¦B_01 ¦SB_01 ¦
¦B_02 ¦SB_02 ¦
¦B_02 ¦SB_03 ¦
¦B_03 ¦SB_04 ¦
+--------+----------+
其中 B_ 和 SB_ 只是批次的名称(标识符),不需要聚合。
我想退货:
+--------+-----------+-----------+
¦Batch +Sub_Batch1 ¦Sub_Batch2 ¦
¦--------¦-----------¦-----------¦
¦B_01 ¦SB_01 ¦ ¦
¦B_02 ¦SB_02 ¦SB_03 ¦
¦B_03 ¦SB_04 ¦ ¦
+--------+-----------+-----------+
看起来 PARTITION BY 或 PIVOT 是要走的路,但我似乎只能找到聚合函数。
感谢您的帮助!
【问题讨论】:
会不会只有 sub_batch1 和 sub_batch2?你想动态制作吗? 它应该只有两个子批次,但还有其他类似的系统可能会更多,因此动态会很有用。 【参考方案1】:如果只有 2 个子批次,那么您可以简单地使用 MIN
和 MAX
聚合函数,如下所示:
SQL> WITH YOUR_TABLE(Batch, Sub_batch) AS
2 (SELECT 'B_01', 'SB_01' FROM DUAL UNION ALL
3 SELECT 'B_02', 'SB_02' FROM DUAL UNION ALL
4 SELECT 'B_02', 'SB_03' FROM DUAL UNION ALL
5 SELECT 'B_03', 'SB_04' FROM DUAL)
6 SELECT
7 BATCH,
8 MIN(SUB_BATCH) AS SUB_BATCH1,
9 CASE
10 WHEN MIN(SUB_BATCH) <> MAX(SUB_BATCH) THEN MAX(SUB_BATCH)
11 END AS SUB_BATCH2
12 FROM YOUR_TABLE
13 GROUP BY BATCH
14 ORDER BY BATCH;
BATCH SUB_BATCH1 SUB_BATCH2
---------- ---------- ----------
B_01 SB_01
B_02 SB_02 SB_03
B_03 SB_04
SQL>
干杯!!
【讨论】:
在 SUB_BATCH 只是一个标识符(字母数字)而不是数字的情况下,MIN 和 MAX 是否有效? 是的!您可以从答案中给出的示例中看到它 谢谢@Tejash,不知怎的完全错过了那个!【参考方案2】:您可以先应用row_number()
功能,然后使用conditional aggregation
:
with t as
(
select t0.*,
row_number() over (partition by Batch order by Sub_batch) as rn
from t0
)
select Batch,
max(case when rn = 1 then Sub_batch end) as Sub_Batch1,
max(case when rn = 2 then Sub_batch end) as Sub_Batch2
from t
group by Batch
order by Batch;
Demo
【讨论】:
以上是关于oracle 表列值唯一 怎么实现的主要内容,如果未能解决你的问题,请参考以下文章