我寫了一個更新mysql數據庫的vb.net代碼。查詢提取從不同表格插入/更新的所有行
要檢查代碼是否正常工作,我在每個包含插入(o更新)時間戳的數據庫表中添加了一個字段「Updated」。
我可以很容易地從每個表中提取更新的行,但我不知道是否有可能提取所有更新的行只有一個查詢。
請注意,表具有不同的字段和不同數量的字段(所以我無法使用UNION)。
任何提示表示讚賞。
我寫了一個更新mysql數據庫的vb.net代碼。查詢提取從不同表格插入/更新的所有行
要檢查代碼是否正常工作,我在每個包含插入(o更新)時間戳的數據庫表中添加了一個字段「Updated」。
我可以很容易地從每個表中提取更新的行,但我不知道是否有可能提取所有更新的行只有一個查詢。
請注意,表具有不同的字段和不同數量的字段(所以我無法使用UNION)。
任何提示表示讚賞。
所以首先2個想法:
1)選擇聯盟
例如:
SELECT * FROM Table_name_1
WHERE Updated > '20.07.2015'
UNION
SELECT * FROM Table_name_2
WHERE Updated > '20.07.2015'
UNION
SELECT * FROM Table_name_3
WHERE Updated > '20.07.2015'
2),如果你有200個表格..最先進的,這將需要一些測試
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('Product')
AND TABLE_SCHEMA='YourDatabase';
而且你需要創建一個這樣的遊標
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(16);
DECLARE b, c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
OPEN cur2;
read_loop: LOOP
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF done THEN
LEAVE read_loop;
END IF;
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END LOOP;
CLOSE cur1;
CLOSE cur2;
END;
玩得開心!和谷歌努力!
OK測試fidlle:fiddle with 3 tables
CREATE TABLE table1
(`id` int, `productName` varchar(10), `Updated` datetime(6));
INSERT INTO table1 (`id`, `productName`, `Updated`)
VALUES
(1, 'OpenIM', '2015-07-21 13:58:01'),
(2, 'OpenAM', '2015-07-20 10:42:01'),
(3, 'OpenDJ', '2015-07-19 12:22:01')
;
CREATE TABLE table2
(`id` int, `productName` varchar(10), `Updated` datetime(6));
INSERT INTO table2 (`id`, `productName`, `Updated`)
VALUES
(1, 'OpenIMaa', '2015-07-21 21:58:01'),
(2, 'OpenAMbb', '2015-07-21 09:42:01'),
(3, 'OpenDJbb', '2015-07-20 07:22:01')
;
CREATE TABLE table3
(`id` int, `productName` varchar(10), `Updated` datetime(6));
INSERT INTO table3 (`id`, `productName`, `Updated`)
VALUES
(1, 'DDOpenIM', '2015-07-21 11:58:01'),
(2, 'FFOpenAM', '2015-07-21 10:42:01'),
(3, 'GGOpenDJ', '2015-07-19 12:22:01')
;
構建模式
SELECT * FROM table1
WHERE Updated >= subdate(current_date, 1)
UNION
SELECT * FROM table2
WHERE Updated >= subdate(current_date, 1)
UNION
SELECT * FROM table3
WHERE Updated >= subdate(current_date, 1);
執行SQL
| id | productName | Updated |
|----|-------------|------------------------|
| 1 | OpenIM | July, 21 2015 13:58:01 |
| 2 | OpenAM | July, 20 2015 10:42:01 |
| 1 | OpenIMaa | July, 21 2015 21:58:01 |
| 2 | OpenAMbb | July, 21 2015 09:42:01 |
| 3 | OpenDJbb | July, 20 2015 07:22:01 |
| 1 | DDOpenIM | July, 21 2015 11:58:01 |
| 2 | FFOpenAM | July, 21 2015 10:42:01 |
玩得開心!
如果您以這種方式更改第一個表:CREATE TABLE table1 \t('id' int,'productName' varchar(10),'Productid' int,'updated' datetime(6 )); INSERT INTO表1 \t('id','productName','Productid','Updated') VALUES \t(1, 'OpenIM',1 '2015年7月21日13時58分01秒'), \t(2,'OpenAM',2,'2015-07-20 10:42:01'), \t(3,'OpenDJ',3,'2015-07-19 12:22:01');你會發現這是行不通的 – genespos
你能提供一些代碼嗎?你嘗試過SEL ... UNION嗎? – CristiC777
@ CristiC777我實際上對每個表使用'SELECT * FROM a_table_name WHERE更新> DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY)''。我寫了一個問題,我試着用'UNION',但它不起作用,因爲有不同數量的字段 – genespos
我不認爲數字o字段是UNION的問題..如果所有表都定義了字段:'Updated '就像你說的(「在數據庫的每個表格中添加了一個字段」),所以每個SELECT ..在每個表格中都有他自己的更新字段。 – CristiC777