我的查询如下 -
我有一个包含2列Name
和Mobile Number
的表格。
例如
[Name]: A, A, B, C, A, D, D, E, and so on
[Mobile Number]: 1,1,2,2,4,3 and so on
一个Name
可以拥有多个手机号码。
我需要查找与查询中所有名称相同的所有移动电话号码。
截至目前,我正在使用for循环的Intersect语句数组。
EG。 Find,Common of A,B,C,D,E(其中Find_Common是我编写的用于生成相关SQL查询的函数)
{DISTINCT INTERSECT A+B+C+D+E}
这会返回NULL,因为以上所有内容都没有任何共同之处。
EG。 Find,Common of A,B
{DISTINCT INTERSECT A+B}
返回1,2
但理想情况下,我甚至想要A,B,C,D,E的Find_Common 应该给我1,2(即SQL应该检查AB,ABC,ABD等的内部组合)
如果找到名称数组元素的组合然后生成SQL查询,我可以得到所需的结果。但我想知道是否有更有效的方法?
这在SQL中可行吗?要清楚的是,是否可以在多个查询上交叉,并且SQL会自动尝试多个查询的子集组合的交集?
任何人都可以请指导我(例如,我们可以通过交集,内部联接等方式吗?)或指导我与特定示例的某些链接,以便我可以学习。
我到处寻找但没找到任何解决方案!
最诚挚的问候,
乔吉
(抱歉格式化。仍然试图掌握这个:))
您好cHao和mehdi lotfi,感谢您的快速回复。我会尝试mehdi的解决方案并尽快恢复。在此期间,请查看所需的其他详细信息。表格列如下所示 -
Name King Pin King Pin Blackbeard Blackbeard Blackbeard Blackbeard Jackal Jackal Jackal Jackal Jackal Jackal
MobileNumber +919844705231 +919844702018 +919844705103 +919844701273 +919844701273 +919844704063 +919844700415 +919844705841 +919844700596 +919844705231 +919844706955 +919844706402
所以回答cHao的问题 - 每行包含1个名字和1个手机号码
答案 0 :(得分:0)
我建议使用表类型,并使用此类型参数存储过程。 您可以使用名称列表执行存储过程,并以逗号分隔格式获取移动号码。
CREATE TYPE NameList AS TABLE (Name NVARCHAR(100))
GO
CREATE PROCEDURE spMobileResult
@names dbo.NameList READONLY
AS BEGIN
SELECT STUFF(
(SELECT DISTINCT ','+[Mobile Number]
FROM YourTable
WHERE Name IN (SELECT Name FROM @Names)
FOR XML PATH('')),1,1,'') AS [Mobile Numbers]
END
GO
DECLARE @A dbo.NameList
INSERT INTO @A(name)VALUES('A'),('B')
EXEC spMobileResult @A
答案 1 :(得分:0)
感谢您的帮助。
在尝试了不同的方法后,我最终采用了以下方法:
如果给出一个名为n个元素的数组,我使用C#中的Facet.Combinatorics
创建了一个包含所有可能组合对的数组,如下所示:
int lowerIndex = 2;
var combinations = new Facet.Combinatorics.Combinations<String>(
BASEstrArrNames,
lowerIndex,
Facet.Combinatorics.GenerateOption.WithoutRepetition
);
上述对在nC2基础上生成,其中n是总名称元素的数量,2表示对组合(即nCr)
以上生成的所有对(不重复)都存储在保存数组中。
我在每对上找到了INTERSECT,然后将所有INTERSECTS组合起来使用Arbor.js生成网络图
我似乎无法发布图表的示例图片,因为我没有足够的声誉,但随时可以与我联系以获取任何帮助。