从SQL Server中具有两个链接表的表中提取多行

时间:2018-11-19 13:33:53

标签: sql sql-server

我有一个表,我们称它为Case,案例表包含有关案例的基本信息,例如CaseNumberCaseOwner

在第二个表CasePersons中,保留了有关附加到特定案例编号的个人的详细信息。这包括PersonIdFirstNameLastNameCasePersons通过Case链接到CaseNumber

在第三张表中,ContactDetails存储了与特定人相关联的许多电话号码。 Type中的ContactDetails列代表电话号码的类型,例如家庭,移动或工作。 ContactDetails通过CasePersons链接到PersonId

更清楚:

Case
------------------------
CaseNumber     CaseOwner
1              Owner1
2              Owner2
3              Owner3

CasePersons
---------------------
PersonId        CaseNumber      FirstName     LastName
1               1               Bob           Person
2               1               Jim           Human
3               2               Gary          Man
4               3               Pete          Smith
5               3               Matt          Jones


CaseDetails
-------------------------
PersonId       Detail        Type
1              0123456789    1
1              1111111111    2
2              2222222222    1
1              0101001011    3
2              1234123412    2
3              0000011111    1
3              1231231231    2

我希望能够编写一个查询,以查询案件的基本详细信息,以及与案件相关的所有个人和所有相关的电话号码。

我将如何构造查询以提取此信息?我不确定在Google上找不到有关此信息的信息,因为我不确定要搜索什么。

这样做的主要目的是让我可以找到特定案例的所有关联编号,并将它们存储在一个位置。

预期产量

CaseNumber    CaseOwner    Person1FirstName     Person1LastName     Person1HomeNumber    Person1MobileNumber     Person1WorkNumber     Person2FirstName     Person2LastName     Person2HomeNumber    Person2MobileNumber     Person2WorkNumber  
1             Owner1       Bob                  Person              0123456789           1111111111              0101001011            Jim                  Human               2222222222           1234123412

3 个答案:

答案 0 :(得分:0)

如果可以将一个案例的所有信息显示在多行中,则可以使用多个联接和排序方式将相关行放在一起。

select
    Case.CaseNumber
    ,CaseOwner
    ,CasePersons.PersonID
    ,FirstName
    ,LastName
    ,Detail
    ,Type
from
    Case
    join CasePersons
    on Case.CaseNumber=CasePersons.Casenumber
    join CaseDetails
    on CasePersons.PersonID=CaseDetails.PersonID
Order by
    Case.CaseNumber
    ,CasePersons.PersonID

答案 1 :(得分:0)

只需联接表的相应列即可。

例如: 步骤1:您从“案例”表中获取所有案例信息,因此这就是您的驾驶表。 第2步:要让您的案件涉及到所有人员,请加入“ CasePersons”表        case.CaseNumber =案例人员.CaseNumber 第3步:现在,由于第2步的结果,您获得了与案件相关的所有人员。在此之后,您有兴趣提取涉案人员的电话号码,因此请加入       casepersons.personid = casedetails.personid

查询

import numba as nb
import numpy as np

@nb.jit()
def funcnumba():
    '''
    Add item to position 0 using Numba
    '''
    example = np.arange(0)
    example[0] = 1
    return example

def funcnumpy():
    '''
    Add item to position 0 using Numpy. This produces an error which makes sense
    '''
    example = np.arange(0)
    example[0] = 1
    return example

print(funcnumba())

print(funcnumpy())

答案 2 :(得分:0)

您可以检查以下脚本。我已经添加了动态表,该动态表与每个案例添加到CasePersons表中的最大人数有关。

/*
DROP TABLE #Case;
DROP TABLE #CasePersons;
DROP TABLE #CaseDetails;
DROP TABLE #CaseTemp;
*/
CREATE TABLE #Case
(
    CaseNumber  INT
    ,CaseOwner  VARCHAR(100)
);

INSERT INTO #Case VALUES(1,'Owner1'),(2,'Owner2'),(3,'Owner3');

CREATE TABLE #CasePersons
(
    PersonId    INT
    ,CaseNumber INT
    ,FirstName  VARCHAR(100)
    ,LastName   VARCHAR(100)
);

INSERT INTO #CasePersons
VALUES(1,1,'Bob','Person'),(2,1,'Jim','Human'),(3,2,'Gary','Man'),(4,3,'Pete','Smith'),(5,3,'Matt','Jones');

CREATE TABLE #CaseDetails
(
    PersonId    INT
    ,Detail     VARCHAR(100)
    ,[TYPE]     INT
);

INSERT INTO #CaseDetails
VALUES
(1,'0123456789',1)
,(1,'1111111111',2)
,(2,'2222222222',1)
,(1,'0101001011',3)
,(2,'1234123412',2)
,(3,'0000011111',1)
,(3,'1231231231',2);



    SELECT c.CaseNumber
            ,c.CaseOwner
            ,ROW_NUMBER() OVER (PARTITION BY C.CaseNumber ORDER BY CD.PersonId) RowNumber
            ,CP.PersonId
            ,CP.FirstName
            ,CP.LastName
            ,CD.HomeNumber
            ,CD.MobileNumber
            ,CD.WorkNumber
    INTO #CaseTemp
    FROM #Case C
    LEFT JOIN #CasePersons CP ON C.CaseNumber = CP.CaseNumber
    LEFT JOIN 
    (
        SELECT PersonId
                ,MAX(CASE WHEN TYPE=1 THEN Detail END) HomeNumber 
                ,MAX(CASE WHEN TYPE=2 THEN Detail END) MobileNumber 
                ,MAX(CASE WHEN TYPE=3 THEN Detail END) WorkNumber 
        FROM #CaseDetails
        GROUP BY PersonId
    ) CD ON CP.PersonId = CD.PersonId
    --WHERE CD.TYPE=1
    ORDER BY C.CaseNumber
             ,CP.PersonId

--Create result table            
DROP TABLE #CaseList
GO
CREATE TABLE #CaseList
(
    CaseNumber  INT
    ,CaseOwner  VARCHAR(100)
    ,Person1FirstName   VARCHAR(100)
    ,Person1LastName    VARCHAR(100)
    ,Person1HomeNumber  VARCHAR(100)
    ,Person1MobileNumber VARCHAR(100)
    ,Person1WorkNumber  VARCHAR(100)
)

--Insert first person details to the table
INSERT INTO #CaseList
SELECT   CaseNumber
        ,CaseOwner
        ,FirstName
        ,LastName
        ,HomeNumber
        ,MobileNumber
        ,WorkNumber
FROM #CaseTemp
WHERE RowNumber=1

--Create additional person fields
    DECLARE @SQLString  VARCHAR(MAX)=''
    DECLARE @MaxPerson  INT=(SELECT MAX(RowNumber) FROM #CaseTemp)
    DECLARE @Seq    int=2

    --
    WHILE @MaxPerson>=@Seq
    BEGIN
        SET @SQLString='ALTER TABLE #CaseList ADD Person'+CAST(@Seq AS VARCHAR)+'FirstName VARCHAR(100);'
        SET @SQLString=@SQLString+CHAR(13)+'ALTER TABLE #CaseList ADD Person'+CAST(@Seq AS VARCHAR)+'LastName  VARCHAR(100);'
        SET @SQLString=@SQLString+CHAR(13)+'ALTER TABLE #CaseList ADD Person'+CAST(@Seq AS VARCHAR)+'HomeNumber  VARCHAR(100);'
        SET @SQLString=@SQLString+CHAR(13)+'ALTER TABLE #CaseList ADD Person'+CAST(@Seq AS VARCHAR)+'MobileNumber  VARCHAR(100);'
        SET @SQLString=@SQLString+CHAR(13)+'ALTER TABLE #CaseList ADD Person'+CAST(@Seq AS VARCHAR)+'WorkNumber  VARCHAR(100);'
        SET @Seq +=1
    END

    EXEC (@SQLString)

--Update additional person details 
SET @SQLString=''

SET @Seq=2
WHILE @MaxPerson>=@Seq
BEGIN
    SET @SQLString=@SQLString+CHAR(13)+'UPDATE #CaseList SET Person'+CAST(@Seq AS VARCHAR)+'FirstName   =CT.FirstName 
                                                            ,Person'+CAST(@Seq AS VARCHAR)+'LastName    =CT.LastName
                                                            ,Person'+CAST(@Seq AS VARCHAR)+'HomeNumber  =CT.HomeNumber
                                                            ,Person'+CAST(@Seq AS VARCHAR)+'MobileNumber=CT.MobileNumber
                                                            ,Person'+CAST(@Seq AS VARCHAR)+'WorkNumber  =CT.WorkNumber                                                      
                                        FROM #CaseTemp CT 
                                        WHERE #CaseList.CaseNumber=CT.CaseNumber AND CT.RowNumber='+CAST(@Seq AS VARCHAR)+''
    SET @Seq +=1
END

EXEC (@SQLString)

--SELECT * FROM #CaseTemp
SELECT * FROM #CaseList