多年

2013-02-17 72 views
1

的範圍選號我試圖執行一個SQL查詢,使得如下表:多年

id   in_year  out_year 
    ------- ---------- ------------- 
    1   2001  2002 
    2   2002  2002 
    3   2004  2007 

可以查詢這樣,我得到這個範圍映射到該ID的所有的兩年內。舉例來說,我想獲得:

id   year 
--------- --------- 
    1   2001 
    1   2002 
    2   2002 
    3   2004 
    3   2005 
    3   2006 
    3   2007 

具體來說,可以說該表中使用的元素和他們的到來商店購物,以及銷售日期。該查詢將返回映射到商店年份的所有元素ID。

+0

有沒有一個優雅的解決方案(但你可以創建SP或臨時表有多年加入) - 最好是在你的應用程序中做到這一點 – zerkms 2013-02-18 00:07:20

+0

我實際上是試圖通過使用臨時表來做到這一點。你如何做加入? – Sam 2013-02-18 00:25:07

+0

創建一個數字爲'1..42'的臨時表,並將其加入當前表中'ON_out_year <= in_year + tmp.n',其中'tmp'是一個臨時表,'n'是唯一的列名 – zerkms 2013-02-18 00:38:04

回答

0

您可以構建同裏一個臨時表中的各種數據,即

CREATE TABLE tmp_years (
yr YEAR NOT NULL, 
PRIMARY KEY (yr) 
) ENGINE=INNODB; 

INSERT INTO tmp_years (yr) VALUES (2000), (2001), (2002), (2003), (2004), (2005), (2006), (2007); 

,然後做一個JOIN:

SELECT w.id, y.yr FROM wesams_table w 
INNER JOIN tmp_years y ON (y.yr >= w.in_year AND y.yr <= w.out_year); 
+0

不確定如果這將工作。我不能對數據或範圍做出假設,因爲它會動態變化。例如,我想要做的是找到intime_years的最小年份和outtime_years的最大值,從該最小 - 最大範圍生成一個臨時表,然後執行連接。你明白我的意思了嗎? – Sam 2013-02-18 04:28:04

0

最整潔的解決方案是創建一個UDF返回年的範圍和使用CROSS APPLY。

性能應該是相當不錯的UDF將是確定性的

編輯:對不起,我不認爲這也適用於MySQL的。