2014-10-30 26 views
0

我已經爲不再是當前但仍需引用它們的發票歸檔一些舊訂單項。我認爲我需要創建一個VIEW,但並不真正理解它。有人可以提供幫助,以便我可以運行查詢來提取發票,然後分配所有訂單項的總數(不管該項目在哪個表中)?MySql - 創建視圖以從多個表中讀取

CREATE TABLE `Invoice` (
    `Invoice_ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `Invoice_CreatedDateTime` DATETIME DEFAULT NULL, 
    `Invoice_Status` ENUM('Paid','Sent','Unsent','Hold') DEFAULT NULL, 
    `LastUpdatedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`ID`), 
    KEY `LastUpdatedAt` (`LastUpdatedAt`) 
) ENGINE=MYISAM DEFAULT CHARSET=latin1 

CREATE TABLE `Invoice_LineItem` (
    `LineItem_ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `LineItem_ChargeType` VARCHAR(64) NOT NULL DEFAULT '', 
    `LineItem_InvoiceID` INT(11) UNSIGNED DEFAULT NULL, 
    `LineItem_Amount` DECIMAL(11,4) DEFAULT NULL, 
    `LastUpdatedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`LineItem_ID`), 
    KEY `LastUpdatedAt` (`LastUpdatedAt`), 
    KEY `LineItem_InvoiceID` (`LineItem_InvoiceID`) 
) ENGINE=MYISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 

CREATE TABLE `Invoice_LineItem_Archived` (
    `LineItem_ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `LineItem_ChargeType` VARCHAR(64) NOT NULL DEFAULT '', 
    `LineItem_InvoiceID` INT(11) UNSIGNED DEFAULT NULL, 
    `LineItem_Amount` DECIMAL(11,4) DEFAULT NULL, 
    `LastUpdatedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`LineItem_ID`), 
    KEY `LastUpdatedAt` (`LastUpdatedAt`), 
    KEY `LineItem_InvoiceID` (`LineItem_InvoiceID`) 
) ENGINE=MYISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 

通常我只想由於對發票

SELECT 
    Invoice_ID, 
    Invoice_CreatedDateTime, 
    Invoice_Status, 
    (SELECT SUM(LineItem_Amount) AS totAmt FROM Invoice_LineItem WHERE LineItem_InvoiceID=Invoice_ID) AS Invoice_Total 
FROM 
    Invoice 
WHERE 
    Invoice_Status='Sent' 

而且運行下面的查詢來獲取量我怎麼能選擇一個查詢兩個表中的所有行項目?

SELECT 
    LineItem_ID, 
    LineItem_ChargeType, 
    LineItem_Amount 
FROM 
    Invoice_LineItem 
WHERE 
    LineItem_InvoiceID='1234' 

回答

2

可以使用MERGE Storage Engine創建一個虛擬表這兩個實表的聯合:

CREATE TABLE Invoice_LineItem_All 
(
    `LineItem_ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `LineItem_ChargeType` VARCHAR(64) NOT NULL DEFAULT '', 
    `LineItem_InvoiceID` INT(11) UNSIGNED DEFAULT NULL, 
    `LineItem_Amount` DECIMAL(11,4) DEFAULT NULL, 
    `LastUpdatedAt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    KEY (`LineItem_ID`), 
    KEY `LastUpdatedAt` (`LastUpdatedAt`), 
    KEY `LineItem_InvoiceID` (`LineItem_InvoiceID`) 
) ENGINE=MERGE UNION=(Invoice_LineItem_Archived, Invoice_LineItem); 
0

您可以使用UNION

SELECT a.* FROM a 
    UNION 
SELECT b.* FROM b; 

你只需要擁有您的不同查詢中列的數量和類型相同。 據我記得,你可以在子查詢中添加測試,但我不確定你可以訂購全局結果。

http://dev.mysql.com/doc/refman/4.1/en/union.html