多个相交的问题

时间:2014-08-25 05:40:59

标签: sql sql-server sql-server-2008 sql-server-2005

我的查询如下 -

我有一个包含2列NameMobile 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个手机号码

2 个答案:

答案 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)

感谢您的帮助。

在尝试了不同的方法后,我最终采用了以下方法:

  1. 如果给出一个名为n个元素的数组,我使用C#中的Facet.Combinatorics创建了一个包含所有可能组合对的数组,如下所示:

    int lowerIndex = 2;
    var combinations = new Facet.Combinatorics.Combinations<String>(
        BASEstrArrNames, 
        lowerIndex, 
        Facet.Combinatorics.GenerateOption.WithoutRepetition
    );
    
  2. 上述对在nC2基础上生成,其中n是总名称元素的数量,2表示对组合(即nCr)

  3. 以上生成的所有对(不重复)都存储在保存数组中。

  4. 我在每对上找到了INTERSECT,然后将所有INTERSECTS组合起来使用Arbor.js生成网络图

  5. 我似乎无法发布图表的示例图片,因为我没有足够的声誉,但随时可以与我联系以获取任何帮助。