我有一个表,我们称它为Case
,案例表包含有关案例的基本信息,例如CaseNumber
和CaseOwner
。
在第二个表CasePersons
中,保留了有关附加到特定案例编号的个人的详细信息。这包括PersonId
,FirstName
和LastName
。 CasePersons
通过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
答案 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