SQL 查找字段的部分重复项

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。

Aar*_*and 8

您可以使用以下方法识别重复的 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)