@@ -1886,6 +1886,7 @@ CREATE TABLE measurement_y2007m01 (
1886
1886
) WITH (autovacuum_enabled=off);
1887
1887
ALTER TABLE measurement_y2007m01 DROP COLUMN filler;
1888
1888
ALTER TABLE measurement_y2007m01 INHERIT measurement;
1889
+ INSERT INTO measurement VALUES (0, '2005-07-21', 5, 15);
1889
1890
CREATE OR REPLACE FUNCTION measurement_insert_trigger()
1890
1891
RETURNS TRIGGER AS $$
1891
1892
BEGIN
@@ -1917,22 +1918,55 @@ INSERT INTO measurement VALUES (1, '2007-01-17', 10, 10);
1917
1918
SELECT tableoid::regclass, * FROM measurement ORDER BY city_id, logdate;
1918
1919
tableoid | city_id | logdate | peaktemp | unitsales
1919
1920
----------------------+---------+------------+----------+-----------
1921
+ measurement | 0 | 07-21-2005 | 5 | 15
1920
1922
measurement_y2006m02 | 1 | 02-10-2006 | 35 | 10
1921
1923
measurement_y2006m02 | 1 | 02-16-2006 | 45 | 20
1922
1924
measurement_y2006m03 | 1 | 03-17-2006 | 25 | 10
1923
1925
measurement_y2006m03 | 1 | 03-27-2006 | 15 | 40
1924
1926
measurement_y2007m01 | 1 | 01-15-2007 | 10 | 10
1925
1927
measurement_y2007m01 | 1 | 01-17-2007 | 10 | 10
1926
- (6 rows)
1928
+ (7 rows)
1927
1929
1928
1930
CREATE TABLE new_measurement (LIKE measurement) WITH (autovacuum_enabled=off);
1931
+ INSERT INTO new_measurement VALUES (0, '2005-07-21', 25, 20);
1929
1932
INSERT INTO new_measurement VALUES (1, '2006-03-01', 20, 10);
1930
1933
INSERT INTO new_measurement VALUES (1, '2006-02-16', 50, 10);
1931
1934
INSERT INTO new_measurement VALUES (2, '2006-02-10', 20, 20);
1932
1935
INSERT INTO new_measurement VALUES (1, '2006-03-27', NULL, NULL);
1933
1936
INSERT INTO new_measurement VALUES (1, '2007-01-17', NULL, NULL);
1934
1937
INSERT INTO new_measurement VALUES (1, '2007-01-15', 5, NULL);
1935
1938
INSERT INTO new_measurement VALUES (1, '2007-01-16', 10, 10);
1939
+ BEGIN;
1940
+ MERGE INTO ONLY measurement m
1941
+ USING new_measurement nm ON
1942
+ (m.city_id = nm.city_id and m.logdate=nm.logdate)
1943
+ WHEN MATCHED AND nm.peaktemp IS NULL THEN DELETE
1944
+ WHEN MATCHED THEN UPDATE
1945
+ SET peaktemp = greatest(m.peaktemp, nm.peaktemp),
1946
+ unitsales = m.unitsales + coalesce(nm.unitsales, 0)
1947
+ WHEN NOT MATCHED THEN INSERT
1948
+ (city_id, logdate, peaktemp, unitsales)
1949
+ VALUES (city_id, logdate, peaktemp, unitsales);
1950
+ SELECT tableoid::regclass, * FROM measurement ORDER BY city_id, logdate, peaktemp;
1951
+ tableoid | city_id | logdate | peaktemp | unitsales
1952
+ ----------------------+---------+------------+----------+-----------
1953
+ measurement | 0 | 07-21-2005 | 25 | 35
1954
+ measurement_y2006m02 | 1 | 02-10-2006 | 35 | 10
1955
+ measurement_y2006m02 | 1 | 02-16-2006 | 45 | 20
1956
+ measurement_y2006m02 | 1 | 02-16-2006 | 50 | 10
1957
+ measurement_y2006m03 | 1 | 03-01-2006 | 20 | 10
1958
+ measurement_y2006m03 | 1 | 03-17-2006 | 25 | 10
1959
+ measurement_y2006m03 | 1 | 03-27-2006 | 15 | 40
1960
+ measurement_y2006m03 | 1 | 03-27-2006 | |
1961
+ measurement_y2007m01 | 1 | 01-15-2007 | 5 |
1962
+ measurement_y2007m01 | 1 | 01-15-2007 | 10 | 10
1963
+ measurement_y2007m01 | 1 | 01-16-2007 | 10 | 10
1964
+ measurement_y2007m01 | 1 | 01-17-2007 | 10 | 10
1965
+ measurement_y2007m01 | 1 | 01-17-2007 | |
1966
+ measurement_y2006m02 | 2 | 02-10-2006 | 20 | 20
1967
+ (14 rows)
1968
+
1969
+ ROLLBACK;
1936
1970
MERGE into measurement m
1937
1971
USING new_measurement nm ON
1938
1972
(m.city_id = nm.city_id and m.logdate=nm.logdate)
@@ -1946,15 +1980,45 @@ WHEN NOT MATCHED THEN INSERT
1946
1980
SELECT tableoid::regclass, * FROM measurement ORDER BY city_id, logdate;
1947
1981
tableoid | city_id | logdate | peaktemp | unitsales
1948
1982
----------------------+---------+------------+----------+-----------
1983
+ measurement | 0 | 07-21-2005 | 25 | 35
1949
1984
measurement_y2006m02 | 1 | 02-10-2006 | 35 | 10
1950
1985
measurement_y2006m02 | 1 | 02-16-2006 | 50 | 30
1951
1986
measurement_y2006m03 | 1 | 03-01-2006 | 20 | 10
1952
1987
measurement_y2006m03 | 1 | 03-17-2006 | 25 | 10
1953
1988
measurement_y2007m01 | 1 | 01-15-2007 | 10 | 10
1954
1989
measurement_y2007m01 | 1 | 01-16-2007 | 10 | 10
1955
1990
measurement_y2006m02 | 2 | 02-10-2006 | 20 | 20
1991
+ (8 rows)
1992
+
1993
+ BEGIN;
1994
+ MERGE INTO new_measurement nm
1995
+ USING ONLY measurement m ON
1996
+ (nm.city_id = m.city_id and nm.logdate=m.logdate)
1997
+ WHEN MATCHED THEN DELETE;
1998
+ SELECT * FROM new_measurement ORDER BY city_id, logdate;
1999
+ city_id | logdate | peaktemp | unitsales
2000
+ ---------+------------+----------+-----------
2001
+ 1 | 02-16-2006 | 50 | 10
2002
+ 1 | 03-01-2006 | 20 | 10
2003
+ 1 | 03-27-2006 | |
2004
+ 1 | 01-15-2007 | 5 |
2005
+ 1 | 01-16-2007 | 10 | 10
2006
+ 1 | 01-17-2007 | |
2007
+ 2 | 02-10-2006 | 20 | 20
1956
2008
(7 rows)
1957
2009
2010
+ ROLLBACK;
2011
+ MERGE INTO new_measurement nm
2012
+ USING measurement m ON
2013
+ (nm.city_id = m.city_id and nm.logdate=m.logdate)
2014
+ WHEN MATCHED THEN DELETE;
2015
+ SELECT * FROM new_measurement ORDER BY city_id, logdate;
2016
+ city_id | logdate | peaktemp | unitsales
2017
+ ---------+------------+----------+-----------
2018
+ 1 | 03-27-2006 | |
2019
+ 1 | 01-17-2007 | |
2020
+ (2 rows)
2021
+
1958
2022
DROP TABLE measurement, new_measurement CASCADE;
1959
2023
NOTICE: drop cascades to 3 other objects
1960
2024
DETAIL: drop cascades to table measurement_y2006m02
0 commit comments