2015-05-30 25 views
1

我正在處理一些價格數據,並且我有兩個數據庫。其中一個,我每天都有價格,另一個我有季度基本數據。 但是,每個數據庫中的股票都有不同的標識符,所以我得到了一個鏈接表。我想加入我的價格數據庫與鏈接表,所以我得到每個股票的匹配標識符。最後的目標是將這個修改後的價格表與基本數據表(我將從鏈接表中獲得的標識符進行連接)。未能成功實現左連接 - 列保留爲空

但是,我想填寫的列:Dados_CRSP.GVKEY,LINKDATE和LINKENDDATE返回null。似乎沒有對價格表進行修改。這是我第一次使用SQL,所以我可能在做一些非常愚蠢的事情! 另外,抱歉格式不正確。

的代碼和數據的一個例子如下遵循:

Dados CRSP(價格表):

+--------------+--------+---------+-------+----------+-------------+ 
| RET_DATE  | PERMCO | PRICE | GVKEY | LINKDATE | LINKENDDATE | 
+--------------+--------+---------+-------+----------+-------------+ 
| '1986-02-04' | 7976 | -17.625 | NULL | NULL  | NULL  | 
| '1986-02-05' | 7976 | -18.375 | NULL | NULL  | NULL  | 
+--------------+--------+---------+-------+----------+-------------+ 

LINKTABLE:

+-------+--------+--------------+--------------+ 
| gvkey | PERMCO | LINKDT | LINKENDDT | 
+-------+--------+--------------+--------------+ 
| 1004 | 20000 | '1972-04-24' | '2014-12-31' | 
| 1010 | 22156 | 1962-01-31', | '1984-06-28' | 
+-------+--------+--------------+--------------+ 

CODE:

CREATE TABLE Dados_CRSP 
(
RET_DATE DATE, -- date 
PERMCO INTEGER, -- price identifier 
PRICE FLOAT, 
GVKEY integer , -- This starts empty 
LINKDATE DATE , -- This starts empty 
LINKENDDATE DATE -- This starts empty 
) 
; 

LOAD DATA LOCAL INFILE filename 
INTO TABLE Dados_CRSP 
COLUMNS TERMINATED BY ',' 
IGNORE 1 LINES; 

CREATE TABLE LINK_TABLE 
(
GVKEY INTEGER, -- fundamental data identifier 
PERMCO INTEGER, 
LINKDATE DATE, -- Date when GVKEY PERMCO mapping starts for given stock 
LINKENDDATE DATE -- Date when GVKEY PERMCO mapping end for given stock 
) 
; 

LOAD DATA LOCAL INFILE filename 
INTO TABLE LINK_TABLE 
COLUMNS TERMINATED BY ',' 
IGNORE 1 LINES; 

UPDATE LINK_TABLE 
SET LINKENDDATE = '2014-12-31' 
WHERE LINKENDDATE = '0000-00-00'; 

--Added indexes to make the join faster 
ALTER TABLE LINK_TABLE ADD INDEX (PERMCO); 
ALTER TABLE LINK_TABLE ADD INDEX (LINKDATE); 
ALTER TABLE LINK_TABLE ADD INDEX (LINKENDDATE); 

ALTER TABLE Dados_CRSP ADD INDEX (PERMCO); 
ALTER TABLE Dados_CRSP ADD INDEX (RET_DATE); 


--I make the join on matching identifiers and when the date is between the date of 
--activity for the given identifier. I do this because the same company may change mapping through time` 
UPDATE Dados_CRSP 
LEFT JOIN LINK_TABLE ON 
    Dados_CRSP.PERMCO = LINK_TABLE.PERMCO 
SET 
    Dados_CRSP.GVKEY = LINK_TABLE.GVKEY 
    AND Dados_CRSP.LINKDATE = LINK_TABLE.LINKDATE 
    AND Dados_CRSP.LINKENDDATE = LINK_TABLE.LINKENDDATE 
WHERE 
    Dados_CRSP.RET_DATE >= LINK_TABLE.LINKDATE 
    AND Dados_CRSP.RET_DATE <= LINK_TABLE.LINKENDDATE; 
+0

兩個表中的日期似乎是不同的格式。 – Tim3880

+0

這只是一個顯示的東西。這些列都是「CREATE TABLE」語句中所示的「DATE」類型。 –

+0

@EdGibbs,這是我的不好。我從CSV中複製了一個表格,而從MySQL複製了其他表格,因此顯示效果有所不同。現在它已被糾正。 –

回答

1

您的WHERE子句不適用le NULLs,所以它創建了一個隱式的內部聯接。此外,你的UPDATE語法是錯誤的。 SET之後的列列表由逗號分隔,而不是與。

你需要做到以下幾點:

UPDATE Dados_CRSP 
LEFT JOIN LINK_TABLE ON 
    Dados_CRSP.PERMCO = LINK_TABLE.PERMCO 
SET 
    Dados_CRSP.GVKEY = LINK_TABLE.GVKEY, 
    Dados_CRSP.LINKDATE = LINK_TABLE.LINKDATE, 
    Dados_CRSP.LINKENDDATE = LINK_TABLE.LINKENDDATE 
WHERE 
    (Dados_CRSP.RET_DATE >= LINK_TABLE.LINKDATE OR LINK_TABLE.LINKDATE IS NULL 
    AND (Dados_CRSP.RET_DATE <= LINK_TABLE.LINKENDDATE OR LINK_TABLE.LINKENDDATE IS NULL); 

或者,你可以只指定這個條件作爲連接條件。你不需要在那裏處理NULL,因爲JOIN還沒有發生。

UPDATE Dados_CRSP 
LEFT JOIN LINK_TABLE ON 
    Dados_CRSP.PERMCO = LINK_TABLE.PERMCO 
    AND Dados_CRSP.RET_DATE >= LINK_TABLE.LINKDATE 
    AND Dados_CRSP.RET_DATE <= LINK_TABLE.LINKENDDATE 
SET 
    Dados_CRSP.GVKEY = LINK_TABLE.GVKEY, 
    Dados_CRSP.LINKDATE = LINK_TABLE.LINKDATE, 
    Dados_CRSP.LINKENDDATE = LINK_TABLE.LINKENDDATE; 

這是我看到的唯一的實際設計問題,但這是假設你確實想要一個左連接在這裏。

+0

感謝您的幫助,但它沒有奏效。每行仍然返回空值。 –

+0

@ArturSilva然後看看你的數據。我的意思是,'SELECT * FROM Dados_CRSP LEFT JOIN LINK_TABLE ON Dados_CRSP.PERMCO = LINK_TABLE.PERMCO'給你所有的LINK_TABLE字段的空值?你確定你的數據加入了嗎?您的示例數據當然不會。 –

+0

上面的查詢不返回空值。我也手動搜索數據,數據肯定會加入。 –