2015-07-21 24 views
0

我寫了一個更新mysql數據庫的vb.net代碼。查詢提取從不同表格插入/更新的所有行

要檢查代碼是否正常工作,我在每個包含插入(o更新)時間戳的數據庫表中添加了一個字段「Updated」。

我可以很容易地從每個表中提取更新的行,但我不知道是否有可能提取所有更新的行只有一個查詢。

請注意,表具有不同的字段和不同數量的字段(所以我無法使用UNION)。

任何提示表示讚賞。

+0

你能提供一些代碼嗎?你嘗試過SEL ... UNION嗎? – CristiC777

+0

@ CristiC777我實際上對每個表使用'SELECT * FROM a_table_name WHERE更新> DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY)''。我寫了一個問題,我試着用'UNION',但它不起作用,因爲有不同數量的字段 – genespos

+0

我不認爲數字o字段是UNION的問題..如果所有表都定義了字段:'Updated '就像你說的(「在數據庫的每個表格中添加了一個字段」),所以每個SELECT ..在每個表格中都有他自己的更新字段。 – CristiC777

回答

0

所以首先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; 

玩得開心!和谷歌努力!

0

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 | 

玩得開心!

+0

如果您以這種方式更改第一個表: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