Vertica 数据库中的重复选定行
Duplicate selected row in Vertica Database
有人要求我复制 table 中的特定行。为此,我使用了一个简单的 SQL 语句:
insert into xyz_tablename(x,y) select * from xyz_tablename where x = "something";
但是,此语句会复制 x = "something" 所在的所有行,这就像将所选行乘以 2。
我想要的是通过计数器来控制要复制的行数。在 Vertica 中有任何 function/procedure 吗?
现在我做了什么:
- 研究了函数(我明白了,但是我不能用它来解决这个问题)。
- 学习了程序(学习了,但不明白如何制作那个bash文件)。
- 了解到vertica中没有for-while循环。
谁能帮我解决这个问题?我希望我清楚。如果我遗漏了什么,请告诉我。提前致谢。
尝试如下:
create table mystore.xyz_tablename(
x varchar (10)
,y INT
)
;
INSERT INTO mystore.xyz_tablename VALUES('abc' ,1);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,2);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,3);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,4);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,5);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,6);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,7);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,8);
select * from mystore.xyz_tablename;
mystore_owner=> select * from mystore.xyz_tablename;
x | y
-----+---
abc | 1
abc | 2
abc | 3
abc | 4
abc | 5
abc | 6
abc | 7
abc | 8
(8 rows)
INSERT INTO mystore.xyz_tablename(x,y)
SELECT a.*
FROM (SELECT * from mystore.xyz_tablename where y = 8 LIMIT 1) a
INNER JOIN (SELECT y FROM mystore.xyz_tablename LIMIT 5) b
ON (1=1)
;
OUTPUT
--------
5
(1 row)
mystore_owner=> select * from mystore.xyz_tablename;
x | y
-----+---
abc | 1
abc | 2
abc | 3
abc | 4
abc | 5
abc | 6
abc | 7
abc | 8
abc | 8
abc | 8
abc | 8
abc | 8
abc | 8
(13 rows)
让我们知道这是否符合您的要求。
副本的数量可以通过limit条款来控制,现在是5,你可以根据自己的意愿改变。但是您可以 select 来自其他 table 也有更多行。如果源 table 有 < than 子句,那么它将失败。
有人要求我复制 table 中的特定行。为此,我使用了一个简单的 SQL 语句:
insert into xyz_tablename(x,y) select * from xyz_tablename where x = "something";
但是,此语句会复制 x = "something" 所在的所有行,这就像将所选行乘以 2。
我想要的是通过计数器来控制要复制的行数。在 Vertica 中有任何 function/procedure 吗?
现在我做了什么:
- 研究了函数(我明白了,但是我不能用它来解决这个问题)。
- 学习了程序(学习了,但不明白如何制作那个bash文件)。
- 了解到vertica中没有for-while循环。
谁能帮我解决这个问题?我希望我清楚。如果我遗漏了什么,请告诉我。提前致谢。
尝试如下:
create table mystore.xyz_tablename(
x varchar (10)
,y INT
)
;
INSERT INTO mystore.xyz_tablename VALUES('abc' ,1);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,2);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,3);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,4);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,5);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,6);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,7);
INSERT INTO mystore.xyz_tablename VALUES('abc' ,8);
select * from mystore.xyz_tablename;
mystore_owner=> select * from mystore.xyz_tablename;
x | y
-----+---
abc | 1
abc | 2
abc | 3
abc | 4
abc | 5
abc | 6
abc | 7
abc | 8
(8 rows)
INSERT INTO mystore.xyz_tablename(x,y)
SELECT a.*
FROM (SELECT * from mystore.xyz_tablename where y = 8 LIMIT 1) a
INNER JOIN (SELECT y FROM mystore.xyz_tablename LIMIT 5) b
ON (1=1)
;
OUTPUT
--------
5
(1 row)
mystore_owner=> select * from mystore.xyz_tablename;
x | y
-----+---
abc | 1
abc | 2
abc | 3
abc | 4
abc | 5
abc | 6
abc | 7
abc | 8
abc | 8
abc | 8
abc | 8
abc | 8
abc | 8
(13 rows)
让我们知道这是否符合您的要求。
副本的数量可以通过limit条款来控制,现在是5,你可以根据自己的意愿改变。但是您可以 select 来自其他 table 也有更多行。如果源 table 有 < than 子句,那么它将失败。