2017-10-01 13 views
1

私は4つのテーブルを持っています。私はそれらのすべてからデータを取得する必要があります。テーブル'Tenancy_histories'には、move_in_date、move_out_date、rentカラムが含まれています。 'Profiles'にはfirst_name、last_name、email、profile_idなどが含まれます。'Referrals'にはreferrer_bonus_amountなどの他のデータが含まれています。INNER JOINのwhere節

最も重要なのは、 'referrer_id(profile idと同じ)'列にそのprofile_idの出現回数である特定のprofile_idによる参照回数が含まれていることです。 'Houses'には、テナントが使用している家の詳細が含まれています。表「住宅」「プロファイル」は直接リンクされますが、テーブルを介してリンクされていない「Tenancy_histories」私が持っているテナントのフルネーム、連絡先、市とハウス詳細を取得するクエリを記述する必要が

一度も言及されません。

select full_name , phone,[city(hometown)], bhk_details ,profile_id 
from (
select p.full_name , p.phone,p.[city(hometown)], p.bhk_details ,p.profile_id 
from (
select pr.first_name+' '+pr.last_name as full_name, pr.phone, pr.[city(hometown)], hs.bhk_details ,pr.profile_id 
from Profiles pr 
INNER JOIN 
Tenancy_histories th 
on pr.profile_id = th.profile_id 
INNER JOIN 
Houses hs 
on th.house_id = hs.house_id 
) as p 
left join 
Referrals rf 
on p.profile_id = rf.[referrer_id(same as profile id)] 
where rf.[referrer_id(same as profile id)] is null 
) as p_r 

答えて

1

これを試してみてください、このような何かをしようとしたが、所望出力に含まを取得されていません

SELECT 
    pr.first_name + ' ' + pr.last_name AS full_name, 
    pr.phone, 
    pr.[city(hometown)], 
    hs.bhk_details 
FROM 
    Profiles pr 
INNER JOIN 
    Tenancy_histories th ON pr.profile_id = th.profile_id 
INNER JOIN 
    Houses hs ON th.house_id = hs.house_id 
WHERE 
    pr.profile_id NOT IN (SELECT [referrer_id(same as profile id)] 
          FROM Referrals) 
1

だけでトリックを行う必要がありますINNERが紹介テーブルにJOINを削除:

は、私はすべてのエラーを取得していないが

SELECT 
    pr.first_name + ' ' + pr.last_name AS full_name, pr.phone, 
    pr.[city(hometown)], hs.bhk_details 
FROM 
    Profiles pr 
INNER JOIN 
    Tenancy_histories th ON pr.profile_id = th.profile_id 
INNER JOIN 
    Houses hs ON th.house_id = hs.house_id 
INNER JOIN 
    Referrals rf ON pr.profile_id = rf.[referrer_id(same as profile id)] 
WHERE 
    pr.profile_id NOT IN (SELECT [referrer_id(same as profile id)] 
          FROM Referrals) 
1

NOT INサブクエリーは危険です。サブクエリのいずれかの行がNULLの値を返した場合、行は返されません。 referralsinner joinを除去することに加えて

、私はNOT EXISTSを使用との比較を変更することはお勧めします:

WHERE NOT EXISTS (SELECT 1 
        FROM referrals 
        WHERE pr.profile_id = r.[referrer_id(same as profile id)] 
       ); 

を代替はreferralsLEFT JOINを使用して、単にマッチが行われていないことを確認することです。

SELECT pr.first_name + ' ' + pr.last_name AS full_name, pr.phone, 
     pr.[city(hometown)], hs.bhk_details 
FROM Profiles pr INNER JOIN 
    Tenancy_histories th 
    ON pr.profile_id = th.profile_id INNER JOIN 
    Houses hs 
    ON th.house_id = hs.house_id LEFT JOIN 
    Referrals rf 
    ON pr.profile_id = rf.[referrer_id(same as profile id)] 
WHERE rf.[referrer_id(same as profile id)] IS NULL; 
+0

ありがとうございました。私は必ずNOT IN句に注意します – Biswa