2013-11-27 208 views
1
id  refid date1   date2   nextdate 
5  10  2008-02-21 2009-02-21 004/2008 
6  10  2009-02-09 2010-02-09 002/2009 
7  10  2010-02-08 2011-02-08 001/2010 
10  11  2007-02-15 2008-02-15 002/2007 
11  11  2008-02-21 2009-02-21 001/2008 
12  11  2009-02-09 2010-02-09 001/2009 
13  11  2010-02-09 2011-02-09 002/2010 
14  11  2011-07-19 2012-07-19 054/2011 
15  11  2012-07-17 2014-07-17 066/2012 
18  14  2007-02-15 2008-02-15 006/2007 
25  16  2007-02-15 2008-02-15 004/2007 
27  16  2009-02-10 2010-02-10 004/2009 
28  16  2010-02-12 2011-02-12 005/2010 
29  16  2011-07-26 2012-07-26 055/2011 
30  16  2012-07-18 2014-07-18 067/2012 

我有這個數據表。我需要查詢,將做到以下幾點: 返回所有行對於其中存在date2的值比2014年1月1日越大REFID(如果有ID,然後在我需要所有IDS)查詢過濾器數據

結果應該是這樣的:

id refid date1   date2   nextdate 
10 11  2007-02-15 2008-02-15 002/2007 
11 11  2008-02-21 2009-02-21 001/2008 
12 11  2009-02-09 2010-02-09 001/2009 
13 11  2010-02-09 2011-02-09 002/2010 
14 11  2011-07-19 2012-07-19 054/2011 
15 11  2012-07-17 2014-07-17 066/2012 
25 16  2007-02-15 2008-02-15 004/2007 
27 16  2009-02-10 2010-02-10 004/2009 
28 16  2010-02-12 2011-02-12 005/2010 
29 16  2011-07-26 2012-07-26 055/2011 
30 16  2012-07-18 2014-07-18 067/2012 
+1

當然上帝這已被現在...... – JsonStatham

+1

你回答別的地方問題是**不夠清楚**,所以難怪你沒有得到你顯然尋找的結果。你的意思可能是這樣的:「返回refid所有行,其中_exists a_ date2值大於2014-01-01」? – Josien

+1

我會改變... :) –

回答

3

這可能會做你想做的,如果我沒有理解您的問題正確:

SELECT * 
FROM  datatable 
WHERE refid IN (SELECT DISTINCT refid 
        FROM datatable 
        WHERE date2 > '20140101') 

子查詢給出返回所有截然不同的值refid存在date2的值大於2014-01-01。您可以使用這些refid的列表來返回所有具有這些refid的行。

編輯
添加一個SQL Fiddle進行實驗。 (另外,SQL Fiddle是幫助你制定你的數據庫的問題更清晰&使他們更容易在一個非常有用的方式來回答一個非常有用的工具!)

+0

我認爲這是正確的解決方案。我會檢查我的數據庫。 Tnx。 –

4

這是很基本的,但如果我理解正確的話你:

DELETE FROM tableName 
WHERE date2 < '2014-01-01' AND NOT (refid IS NULL) 

編輯

正如下面的評論中所述,我可能誤解了問題的以下部分,表示需要刪除條目。

與REFID其中date2的是刪除所有行不到2014年1月1日

在這種情況下,按照指定的日期,而不是之後將返回所有結果:

SELECT * 
FROM tableName 
WHERE date2 > '2014-01-01' AND NOT (refid IS NULL) 

我也假設「與refid」意味着應該填充refid

得到的結果在原來的問題描述,但是我想簡化了查詢,如下所示的日期部分specificied不會放棄的結果:

SELECT * 
FROM tableName 
WHERE (refid = 11) OR (refid = 16) 

另一個編輯

的以下應返回refid的所有條目與date2之後的任何條目2014-01-01

SELECT DISTINCT t1.* 
FROM tableName t1 
INNER JOIN tableName t2 ON t1.refid = t2.refid AND t2.date2 > '2014-01-01' 

另外,您可以使用exists:

SELECT * 
FROM tableName t1 
WHERE EXISTS(
    SELECT * 
    FROM tableName t2 
    WHERE t1.refid = t2.refid AND t2.date2 > '2014-01-01' 
) 

或連結的refid「,這符合輪廓個單獨的表

SELECT * 
FROM tableName t1 
INNER JOIN (
    SELECT DISTINCT refid 
    FROM tableName 
    WHERE date2 > '2014-01-01' 
)t2 ON t1.refid = t2.refid 
+1

不是如何過濾結果的問題,而不是刪除行。在這種情況下,只需將DELETE更改爲SELECT – Abris

+0

我需要返回帶查詢的值,而不是刪除它們。 –

+0

所有查詢都不好,因爲我不會得到想要的結果! –

1

試試這個

SELECT * FROM table WHERE date2 >='2014-01-01' 
+0

不好。結果不好。看看我需要什麼結果。 –

+0

他們沒有任何記錄'date2'小於'2014-01-01'在您的預期輸出 – Rohaan

+0

是的。仔細看看日期2. –

2

爲了獲得成功在你的問題中描述以下工作。

SELECT 
    * 
FROM 
    datatable 
WHERE 
    refid = 11 
    OR refid = 16 

如果你看看你所需要的結果:

id refid date1   date2   nextdate 
10 11  2007-02-15 2008-02-15 002/2007 
11 11  2008-02-21 2009-02-21 001/2008 
12 11  2009-02-09 2010-02-09 001/2009 
13 11  2010-02-09 2011-02-09 002/2010 
14 11  2011-07-19 2012-07-19 054/2011 
15 11  2012-07-17 2014-07-17 066/2012 
25 16  2007-02-15 2008-02-15 004/2007 
27 16  2009-02-10 2010-02-10 004/2009 
28 16  2010-02-12 2011-02-12 005/2010 
29 16  2011-07-26 2012-07-26 055/2011 
30 16  2012-07-18 2014-07-18 067/2012 

你會發現,date2場不符合,你在你的問題中定義的標準:

我有這個數據表。我需要過濾由下列 條件的數據表:與refid刪除所有行,其中date2小於 2014年1月1日

的日期2字段的範圍從2008-02-15和2014年7月18日之間。您在標準中唯一提及的其他參考文獻是「與refid」。查看您的表格和所需的結果,您會注意到您想要選擇的項目的refid爲11或16,因此在問題中指定的過濾日期被證明對嘗試幫助的人更爲分心。你應該考慮澄清你的問題,以防止進一步的混淆,並可能創建一個sql小提琴(goto:http://sqlfiddle.com/),以便人們有能力將他們的結果與你所需的結果進行比較,而不是告訴人們重新閱讀你的問題。

編輯:

以下應返回所有dataTable的結果,其中有一個或多個DataTable入口使用同一個refiddate2 > '2014-01-01'

SELECT * 
FROM datatable t1 
INNER JOIN (
    SELECT DISTINCT refid 
    FROM datatable 
    WHERE date2 > '2014-01-01' 
)t2 ON t1.refid = t2.refid 
+0

我需要一般查詢,因爲這只是我的sql表的一部分。 表大,有很多ID –

+0

我改變了問題,所以也許現在是更好的公式:) 現在檢查:) –