2017-09-24 27 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.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; 

私が間違った順序でいた加入思う:

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

私が得ている最も近い:RIGHT Address.AddressID = Policy.AddressIDのポリシーを登録しよ住所 FROM Insured.InsuredID、Insured.FirstName、Insured.LastName、Address.HouseNumber、Policy.PolicyID を選択 RIGHT JOINのON被保険者Policy.AddressID = Insured.AddressID ORDER BY Insured.InsuredID; – nammrick

+0

私はあなたの元の質問に追加します - それをしてください後でそれをしてください –

答えて

0

あなたは、このクエリを試みることができます。これはあなたに必要なものを与えますか? 更新:アドレステーブルに保険テーブルを追加すると、ポリシーがあるかどうかにかかわらずアドレスが表示されます。

+0

私はあなたとあなたの帰りの保険契約をホームポリシーで変更しましたが、保険証書のない住所の場合、 。 – nammrick

+0

ああ、持っています。私は少し参加を変更しました、これは今OKですか? – bbrumm

+0

それは間違いなく近いです。唯一の問題は、ホームポリシーを持つ被保険者だけでなく、ポリシーなしの被保険者であるすべての被保険者(ホームポリシー、自動ポリシー、ポリシーなし)をクエリが返していることです。 – nammrick

0

データベースのデザインがよさそうです。「PolicyType」の列には少し疑問があると思います。それが保持する価値とこのコラムの目的は何か。

と言います。PolicyType='H'というのは、ホームポリシーであることを意味します。または、同じクエリを検索する他の方法は、policyidhomeテーブルに存在するかどうかを確認することです。

これは間違いありませんか?

メインクエリ、

私は政策とそのアドレスなしでホームポリシー とそのアドレスと被保険者と被保険者を返すクエリのために何が必要ですか?

チェックこのスクリプト、

--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句」があります。