2017-09-24 223 views
1

我正在使用SQL Server查询设计器尝试并形成一个外部查询,该查询将返回每个被保险人的家庭策略和没有策略的全名和地址。我创建语句如下:SQL外部加入 - 加入需要3个表

CREATE TABLE Address (
    AddressID integer NOT NULL, 
    HouseNumber Integer NOT NULL, 
    Street varchar(20) NOT NULL, 
    CityCounty varchar(20) NOT NULL, 
    StateAbb char(2), 
    CountryAbb char(2) NOT NULL, 
    Zip char(5) NOT NULL, 
    LastUpdatedBy varchar(20) NOT NULL, 
    LastUpdated date NOT NULL, 
    CONSTRAINT PK_Address PRIMARY KEY (AddressID)); 

    CREATE TABLE Insured(
    InsuredID integer NOT NULL, 
    FirstName varchar(15) NOT NULL, 
    LastName varchar(15) NOT NULL, 
    MI char(1), 
    DateOfBirth date NOT NULL, 
    CreditScore integer NOT NULL, 
    AddressID integer NOT NULL, 
    DriversLicenseNumber varchar(35), 
    LastUpdatedBy varchar(20) NOT NULL, 
    LastUpdated date NOT NULL, 
    CONSTRAINT PK_Insured PRIMARY KEY (InsuredID), 
    CONSTRAINT FK_InsuredAddress FOREIGN KEY (AddressID) references Address); 

    CREATE TABLE Policy(
    PolicyID integer NOT NULL, 
    EffectiveDate date NOT NULL, 
    TerminationDate date NOT NULL, 
    Amount Numeric (8,2) NOT NULL, 
    PolicyYear integer NOT NULL, 
    PolicyType char(1) NOT NULL, 
    InsuredID integer NOT NULL, 
    AddressID integer NOT NULL, 
    LastUpdatedBy varchar(20) NOT NULL, 
    LastUpdated date NOT NULL, 
    CONSTRAINT PK_Policy PRIMARY KEY (PolicyID), 
    CONSTRAINT FK_PolicyAddress FOREIGN KEY (AddressID) references Address, 
    CONSTRAINT FK_PolicyInsured FOREIGN KEY (InsuredID) references Insured); 

    CREATE TABLE Home(
    PolicyID integer NOT NULL, 
    ExteriorType varchar(30) NOT NULL, 
    Alarm char(3) NOT NULL, 
    DistanceToFireStation integer NOT NULL, 
    LastUpdatedBy varchar(20) NOT NULL, 
    LastUpdated date NOT NULL, 
    CONSTRAINT PK_Home PRIMARY KEY (PolicyID), 
    CONSTRAINT FK_HomePolicy FOREIGN KEY (PolicyID) references Policy); 

    CREATE TABLE Auto(
    PolicyID integer NOT NULL, 
    VinNumber varchar(30) NOT NULL, 
    Make varchar(15) NOT NULL, 
    Model varchar(20) NOT NULL, 
    MilesPerYear integer NOT NULL, 
    LastUpdatedBy varchar(20) NOT NULL, 
    LastUpdated date NOT NULL, 
    CONSTRAINT PK_Auto PRIMARY KEY (PolicyID), 
    CONSTRAINT FK_AutoPolicy FOREIGN KEY (PolicyID) references Policy); 

我相信,查询需要的表处理,保险,政策和外部右侧或左侧加入,但我不能让SQL服务器认识到这一点,因为它使形成内连接和交叉加入。我需要什么样的查询才能确保家庭政策和他们的地址,并确保没有政策和他们的地址?

我试过到目前为止:

SELECT Insured.InsuredID, Insured.FirstName, 
     Insured.LastName, Address.HouseNumber, 
     Policy.PolicyID 
FROM Address RIGHT JOIN Policy 
ON Address.AddressID = Policy.AddressID 
RIGHT JOIN Insured ON Policy.AddressID = Insured.AddressID 
ORDER BY Insured.InsuredID 

这是最近的查询,返回什么,我需要与家庭政策,被保险人但没有一个政策,我得到空的地址被保险人。

SELECT i.InsuredID, i.FirstName, i.MI, i.LastName,    
a.HouseNumber, a.Street, a.CityCounty, a.StateAbb, a.CountryAbb, a.Zip 
FROM INSURED i 
LEFT JOIN (SELECT * FROM Policy WHERE PolicyType = 'H') HomePolicy on  
i.InsuredID = HomePolicy.InsuredID 
LEFT JOIN Address a on HomePolicy.AddressID = a.AddressID; 
+0

向我们展示您的工作。 – nicomp

+0

我已经得到的最接近的:SELECT Insured.InsuredID,Insured.FirstName,Insured.LastName,Address.HouseNumber,Policy.PolicyID 发件人地址 RIGHT JOIN策略在Address.AddressID = Policy.AddressID 右连接投保Policy.AddressID = Insured.AddressID ORDER BY Insured.InsuredID; – nammrick

+0

我会添加到您原来的问题 - 请在将来这样做 –

回答

0

你能尝试此查询:

SELECT i.InsuredID, 
i.FirstName, 
i.LastName, 
a.HouseNumber, 
p.PolicyID 
FROM insured i 
LEFT JOIN policy p ON i.AddressID = p.AddressID AND p.PolicyType = 'H' 
LEFT JOIN address a ON i.AddressID = a.AddressID 
ORDER BY i.InsuredID; 

我想加入是在错误的顺序。这是否给你你需要的东西? 更新:将受保人表加入地址表将显示地址,而不管他们是否有策略。

+0

我改变了你发布的一些信息,并将其返回投保人的住房政策,但对于没有保单的投保人,他们的地址返回为空,所以我肯定会越来越近。 – nammrick

+0

啊,明白了。我已经改变了一点,现在可以吗? – bbrumm

+0

这绝对更接近。现在唯一的问题是,查询返回所有的保险(住房政策,汽车政策,没有政策)不仅保证了住房政策和保险没有政策。 – nammrick

0

数据库设计看起来不错。我认为我们对“PolicyType”列略有疑问。它所持有的价值以及本专栏的目的是什么。

PolicyType='H'这意味着它是家政策。或者其他找到相同查询的方式是检查home表中是否存在policyid

这是正确的吗?

主查询,

我需要为与家庭政策 和他们的地址和被保险人没有政策及其地址返回被保险人查询什么?

检查这个脚本,

--insureds with home policies and their addresses 
select i.InsuredID, 
i.FirstName, 
i.LastName 
A.HouseNumber 
,1 INDICATE 
from Insured i 
INNER JOIN policy p ON i.InsuredID = p.InsuredID 
INNER JOIN [Address] A ON A.ADDRESSID=I.ADDRESSID 
WHERE EXISTS(SELECT PolicyID FROM Home H WHERE h.PolicyID=P.PolicyID) 
AND NOT EXISTS(SELECT PolicyID FROM [Auto] a WHERE A.PolicyID=P.PolicyID) 

UNION ALL 
--insureds with no policy and their addresses 
select i.InsuredID, 
i.FirstName, 
i.LastName 
,A.HouseNumber 
,0 INDICATE 
from Insured i 
INNER JOIN [Address] A ON A.ADDRESSID=I.ADDRESSID 
WHERE EXISTS(SELECT InsuredID FROM policy p WHERE i.InsuredID = p.InsuredID) 

我有使用“EXISTS条款”,因为表列未在您需要的输出。