2017-02-02 17 views
0

タイトルが質問を正当化するかどうかわかりません。 2テーブルtable A atable B bがあります。私は内側の両方のテーブルは、などの一般的なMSISDNを持って、私はtimestamp, frmsisdn, tomsisdn, reference, amounts etcsql:2つのテーブルを結合し、最初のテーブルにあって2番目のテーブルにない場合でもレコードを表示します

のように、ユーザーのトランザクションレポートを持っているtable Bnames, msisdn, regdate, status, address etc

ように私は、ユーザーのすべての詳細を持っているtable A

on (a.msisdn = b.frmsisdn or a.msisdn = b.tomsisdn) 

でこれら2つのテーブルを結合していますTable Aの場合はMSISDNとなり、Table Bの場合はFRMSISDNまたはTOMSISDNのいずれかであるか、いずれのフィールドにも表示されません取引のないsers)。

Table Bの項目がないTable Aのユーザーが表示されていますが、基本的にデータベースに登録されていますが、すべての取引は行われていません。あなたはすべての必要な場合、私は

select mai.msisdn, mai.firstname, mai.lastname, type as account_type, 
alias as nickname, mai.regdate, mai.status, 
amount as balance, count(trai.referenceid) as number_of_transactions, 
sum(trai.amount) as sum_of_transactions from tableA mai 
inner join tableC stk 
on mai.msisdn = stk.msisdn 
inner join tableB trai 
on (mai.msisdn = trai.tomsisdn or mai.msisdn = trai.frmsisdn) 
where trai.status = 0 
and stk.walletid = 0 
group by mai.msisdn, mai.firstname, mai.lastname, mai.type, 
mai.alias, mai.regdate, mai.status, 
stk.amount; 
+6

ヒント:LEFT JOIN – Serg

+1

あなたにはsqlコードが表示されます。 – scaisEdge

+0

左結合または右結合を使用してください - あなたが知っている...あなたが私たちに見せなかった部分はありますか? **それは変更する必要があります** – Hogan

答えて

0

をクエリしようとしていますされ

は、誰かが、彼らはここで

Table Bにエントリを持っていけない場合でも、私は、レポート内のTable AからMSISDNを含まない方法を教えてもらえますテーブルAのエントリも使用左BテーブルにはentyがSIない場合には、表B

select 
     mai.msisdn 
    , mai.firstname 
    , mai.lastname 
    , type as account_type 
    , alias as nickname 
    , mai.regdate 
    , mai.status 
    , amount as balance 
    , count(trai.referenceid) as number_of_transactions 
    , sum(trai.amount) as sum_of_transactions 
    from tableA mai 
    left join tableB trai on (mai.msisdn = trai.tomsisdn or mai.msisdn = trai.frmsisdn) 
    inner join tableC stk on mai.msisdn = stk.msisdn 
    where trai.status = 0 
    and stk.walletid = 0 
    group by 
     mai.msisdn 
    , mai.firstname 
    , mai.lastname 
    , mai.type 
    , mai.alias 
    , mai.regdate 
    , mai.status 
    , stk.amount; 

またはyならために参加しますOU問題が限られているが、内部には、表C

のために内部結合使ってみて、あまりにも、このテーブルのために参加

select 
     mai.msisdn 
    , mai.firstname 
    , mai.lastname 
    , type as account_type 
    , alias as nickname 
    , mai.regdate 
    , mai.status 
    , amount as balance 
    , count(trai.referenceid) as number_of_transactions 
    , sum(trai.amount) as sum_of_transactions 
    from tableA mai 
    left join tableB trai on (mai.msisdn = trai.tomsisdn or mai.msisdn = trai.frmsisdn) 
    left join tableC stk on mai.msisdn = stk.msisdn 
    where trai.status = 0 
    and stk.walletid = 0 
    group by 
     mai.msisdn 
    , mai.firstname 
    , mai.lastname 
    , mai.type 
    , mai.alias 
    , mai.regdate 
    , mai.status 
    , stk.amount; 
+0

左の結合クエリは、内部結合クエリと同じ数の結果を表示しています。表Aのすべてのレコードは表Cにあります –

+0

テーブルaとテーブルbの左結合が同じ数の行fo内結合を取得した場合、これはすべての行が一致することを意味します。制約はテーブルによるものである可能性があります私は答えを更新しました – scaisEdge

+0

答えの両方のクエリは、出力と同じ数の結果を返します。私はテーブルAに128レコードを持っていますが、出力には私は111レコードを取得しています。 17 msisdnはテーブルBにありません –

0

述語が適用されるか(どのような段階での)違いを参照してください

select mai.msisdn, mai.firstname, mai.lastname, type as account_type, 
    alias as nickname, mai.regdate, mai.status, 
    amount as balance, count(trai.referenceid) as number_of_transactions, 
    sum(trai.amount) as sum_of_transactions 
from tableA mai 
inner join tableC stk 
    on mai.msisdn = stk.msisdn 
     and stk.walletid = 0 
left join tableB trai 
    on (mai.msisdn = trai.tomsisdn or mai.msisdn = trai.frmsisdn) 
     and trai.status = 0  
group by mai.msisdn, mai.firstname, mai.lastname, mai.type, 
mai.alias, mai.regdate, mai.status, 
stk.amount; 

をお試しくださいLEFT JOIN .. ONとWHEREの中で。

+0

左の結合または左の結合の両方に同じレコード@Sergを取得しています –

+0

これは、内部結合とは逆に左結合によって戻されるmaiの不一致の行グループがないことを意味します。 – Serg

関連する問題