2013-07-29 533 views
0

我有一個SQL查詢我正在嘗試編寫,但一直沒有能夠拿出解決方案。SQL查詢,查詢同一個表兩次(可能)

我的表中有2個條目是相關的,通過ID的前3個字符相關。當添加需要與某個條目相關的新項目時,會先添加前3個字符,然後將第二個2增加1以創建新ID。當需要完全分開的輸入時,使用唯一的3位字符串,並用「00」開始後兩個字符。可能有一些在最後2列有很大的差距,因爲刪除的數據(我不想在我的查詢中這些)

我想要做的是隻得到行的地方有另一行同前3個字符,並從最後2.

表實施例的計數少1:

ID | Date 
====== ======== 
11100 | 07/12 
22211 | 07/13 
12300 | 07/14 
11101 | 07/14 
11400 | 07/16 
22212 | 07/16 

查詢應僅返回這些元件,因爲有exsists與相同的第一3個字符和一個更小的另一條目來自最後2個字符。

ID | Date 
====== ======== 
11101 | 07/14 
22212 | 07/16 
+0

有沒有讓你的ID列來構建這樣的要求?如果不是,我建議你將你的ID列分成兩個,CategoryID(即111,222..etc)和SeqID(即00,01..etc),它會使查詢變得更容易和更快 –

+0

我完全同意,但這是目前不在我的控制之下。我會改變這種方式,如果它是在我的力量:/ – shenn

回答

5

看起來像一個簡單的JOIN會做到這一點;

SELECT a.* 
FROM Table1 a 
JOIN Table1 b 
    ON a.id/100 = b.id/100 
AND a.id = b.id + 1 

An SQLfiddle to test with

您也可以將其編寫爲EXISTS查詢;

SELECT a.* 
FROM Table1 a 
WHERE EXISTS (
    SELECT 1 FROM Table1 b WHERE b.id = a.id-1 
    AND a.id/100 = b.id/100 
) 

Another SQLfiddle

+0

好,簡單,乾淨! – danihp

0
Declare @a table(ID Varchar(10), [Date] varchar(10)) 
Insert into @a 
Select '11100','07/12' 
UNION Select '22211','07/13' 
UNION Select '12300','07/14' 
UNION Select '11101','07/14' 
UNION Select '11400','07/16' 
UNION Select '22212','07/16' 

Select a.* from 
@a a 
JOIN 
(
Select SubString(ID,1,3) + RIGHT('0'+Cast(MAX(Cast(SubString(ID,4,2) as int)) as Varchar(10)),2) as ID 
from @a 
group by SubString(ID,1,3) 
Having Count(*)>1 
) x 
on x.ID=a.ID 
0

試試這個

SELECT T1.ID,T1.[Date] FROM Table1 T1 INNER JOIN 
(
    SELECT LEFT(ID,3) AS ID,MAX([Date]) AS [Date] FROM Table1 
    GROUP BY LEFT(ID,3) 
    HAVING COUNT(LEFT(ID,3)) > 1 
) T2 ON LEFT(T1.ID,3) = T2.ID 
AND T1.[Date] = T2.[Date] 

SQL FIDDLE DEMO