2013-07-29 520 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