Bol*_*tie 4 sql-server-2008 sql-server t-sql
我有一个表,其中包含一个成员编号字段。该表可以包含该字段具有重复值的记录,并且确实如此。
我有一个 SQL 查询,它将获取该字段的任何重复值,但是,我现在想查找具有相同成员编号的另一条记录但只有 9 个数字中的前 8 个数字的记录。
例如,我想在查询运行时返回以下内容;
MEMBNO
123456789
123456782
Run Code Online (Sandbox Code Playgroud)
目前,我的查询只返回;
MEMBNO
123456789
Run Code Online (Sandbox Code Playgroud)
有两个或多个具有此确切数字的记录。
当前查询是;
SELECT
basic.MEMBNO
FROM
basic
GROUP BY
basic.MEMBNO
HAVING
COUNT(basic.MEMBNO) >1
ORDER BY
basic.MEMBNO
Run Code Online (Sandbox Code Playgroud)
我认为可能有效的查询是;
SELECT
basic.MEMBNO
FROM
basic
GROUP BY
basic.MEMBNO
HAVING
COUNT(LEFT(basic.MEMBNO,8)) >1
ORDER BY
basic.MEMBNO
Run Code Online (Sandbox Code Playgroud)
总的来说,我对 SQL 和数据库不太熟悉,所以如果我没有很好地解释自己,我深表歉意。它是否需要在某处使用 LIKE 运算符?
我正在使用 Microsoft SQL Server 报表生成器 3.0。
您可以使用以下方法识别重复的 1->8 个子字符串:
SELECT LEFT(basic.MEMBNO,8)
FROM dbo.basic
GROUP BY LEFT(basic.MEMBNO,8)
HAVING COUNT(*) > 1;
Run Code Online (Sandbox Code Playgroud)
所以你可以加入它来获得单个值:
;WITH x(m) AS
(
SELECT LEFT(basic.MEMBNO,8)
FROM dbo.basic
GROUP BY LEFT(basic.MEMBNO,8)
HAVING COUNT(*) > 1
)
SELECT b.MEMBNO
FROM dbo.basic AS b
INNER JOIN x
ON x.m = LEFT(b.MEMBNO, 8)
ORDER BY b.MEMBNO;
Run Code Online (Sandbox Code Playgroud)
你也可以这样做(我只是不确定何时引入窗口计数):
;WITH x AS
(
SELECT MEMBNO, c = COUNT(*) OVER (PARTITION BY LEFT(MEMBNO, 8))
FROM dbo.basic
)
SELECT MEMBNO FROM x WHERE c > 1
ORDER BY MEMBNO;
Run Code Online (Sandbox Code Playgroud)