Sql server 2008 选择前6个字符匹配的值

Sql server 2008 选择前6个字符匹配的值,sql-server-2008,tsql,Sql Server 2008,Tsql,我试图从一家表格公司中提取ID列表,其中ID的前6个字符相同。我们的应用程序创建公司ID的方式是,它使用公司名称的前3个字符和城市的前3个字符。因此,我们的公司ID具有相同的前6个字符,后跟一个序列号 我在想用像这样的东西 Select companyID, companyName from Company Where substring(companyID,1,6)+'%' like substring(companyID,1,6)+'%' 基本上,我正在尝试获取前6个字符匹配的所有公司ID

我试图从一家表格公司中提取ID列表,其中ID的前6个字符相同。我们的应用程序创建公司ID的方式是,它使用公司名称的前3个字符和城市的前3个字符。因此,我们的公司ID具有相同的前6个字符,后跟一个序列号

我在想用像这样的东西

Select companyID, companyName from Company Where
substring(companyID,1,6)+'%' like substring(companyID,1,6)+'%'

基本上,我正在尝试获取前6个字符匹配的所有公司ID;结果集应该只显示顶级公司ID(创建的第一个1)和公司名称。我不期望结果的音调,所以我可以使用返回的ID来查找它下面的ID

我想它也可以使用have来完成,其中具有相同前6个字符的ID的计数与have count(*)>1?相同?? 不确定语法是什么…

选择c1.CompanyID、c1.CompanyName、c2.CompanyID、c2.CompanyName
SELECT c1.CompanyID, c1.CompanyName, c2.CompanyID, c2.CompanyName
FROM dbo.Company c1
INNER JOIN dbo.Company c2
ON SUBSTRING(c1.CompanyName,1,6) + '%' LIKE SUBSTRING(c2.CompanyName,1,6) + '%'
AND c1.CompanyID <> c2.CompanyID
来自dbo公司c1 内部连接dbo公司c2 关于子串(c1.CompanyName,1,6)+'%'类似于子串(c2.CompanyName,1,6)+'%' 和c1.公司ID c2.公司ID
选择不同的c1.CompanyID、c1.CompanyName、c2.CompanyID、c2.CompanyName
来自dbo公司c1
加入dbo公司c2
在子串(c1.CompanyName,1,6)=子串(c2.CompanyName,1,6)
c1.CompanyID
如果您希望经常这样做,我会在表中添加一个计算列,该列定义了
子字符串(CompanyName,1,6)
。然后,您可以为其编制索引并使其高效。实际上,它必须扫描所有条目并动态计算子字符串。使用computed列,您可以预先分摊子字符串计算,至少有机会进行有效的查询。

尝试使用Blam的脚本后,我做了一些细微的更改,得到了一些更好的结果。他的脚本返回的结果比表中的行多,而且速度相当慢;我想这是因为公司名称栏。我把它扔掉,这样写:

select distinct c1.cmp_id, count(substring(c2.cmp_id,1,6)) as TotalCount
from company c1
join company c2 on substring(c1.cmp_id,1,6)=substring(c2.cmp_id,1,6)
group by c1.cmp_id
order by c1.cmp_id asc

这仍然会返回所有表记录,但至少在前6个字符多次列出时,我可以看到总计数。而且,它只运行了1秒,所以这也是一个加号。再次感谢大家的投入,永远感谢

为什么像这样的开销。仍然+1你是对的,应该使用=喜欢你的答案。我只是从上面复制和粘贴。只需将表加入到表中,然后比较公司名称。谢谢!我应该能够处理这些结果。非常感谢!所述问题是“结果集应仅显示顶级公司ID(创建的第一个1)和公司名称”。此解决方案不返回公司名称。如果一个解决方案不能满足前面提到的问题,那么它将如何获得更好的结果?我还问“我正在尝试获取所有公司ID,其中前6个字符匹配”。不想开始争论,但那是一个愚蠢的理由-1我。我用你的答案作为参考回答了我自己的问题,并在我自己的帖子上发布了最适合我的内容……”“结果集应该只显示顶级公司ID(创建的第一个1)和公司名称。”你的话不是我的。这是向新用户表示支持的方式;对不起,我没有把帖子里的每一个字都读一遍。强迫症?这些是你帖子里的话。表示支持回答所述问题的人的方式。
select distinct c1.cmp_id, count(substring(c2.cmp_id,1,6)) as TotalCount
from company c1
join company c2 on substring(c1.cmp_id,1,6)=substring(c2.cmp_id,1,6)
group by c1.cmp_id
order by c1.cmp_id asc