2

私は(議論のために)個人、電子メール、属性の3つのテーブルを持っています。個人_個人を電子メールおよび属性にリンクする外部キーを参照します。

特定の個人が属性テーブルに表示される必要はありません。属性が追加されたことがない可能性があり、複数の属性がある場合は複数回表示される可能性があるためです。

個々の参照のリストとそれらの特定の属性の数を取得したいと思います。ただし、個人がメールアドレスを共有することは許可されているため、メールアドレスで検索する必要があります(始めないでください)...

私の最初の刺し傷は

select e.individual_ref, count(a.attr_Code_ref)
from email e left join attribute a on e.individual_Ref = a.individual_ref
where e.email_Address = 'example.email@adomain.net'
and a.attr_code_Ref = 4119 
group by e.individual_ref

左結合を使用して、電子メールに個別の参照が存在する場合はそれを取得し、電子メールに個別の参照が存在するが属性にはない場合に結果を取得するようにします。または、これは行を返さないので、私は思ったが...

select e.individual_ref, 
(select count(a.attr_Code_ref) from attribute a where a.attr_code_Ref = 4119 and a.individual_ref = e.individual_ref)
from email e
where e.email_Address = 'example.email@adomain.net'
group by e.individual_REf

個人_Refとカウントが0の1行を返します

私の理解よりもSQLが壊れていることを示唆しているわけではないので、「私の混乱は何ですか?」と思います。質問です。

4

4 に答える 4

3

次の部分により、結合が変更されます。

from email e left join attribute a on e.individual_Ref = a.individual_ref 
where e.email_Address = 'example.email@adomain.net' 
and a.attr_code_Ref = 4119  

左結合を内部結合に変えたa.attr_codeにwhere句を配置すると、たとえば属性レコードが存在しない場合はnullが返され、where句は失敗します。(a.attr_code_refを4119にすることはできないため、レコードはありませんでした。)

あなたは許可する必要がありますa.attr_code_ref = 4199 or a.attr_code_ref is null

于 2010-02-09T13:40:05.287 に答える
1

最初のものを変更します:

select e.individual_ref, count(a.attr_Code_ref)
from email e left join attribute a on e.individual_Ref = a.individual_ref
where e.email_Address = 'example.email@adomain.net'
and (a.attr_code_Ref = 4119 or a.individual_ref is null)
group by e.individual_ref

同じ結果が得られます

于 2010-02-09T13:42:06.043 に答える
1

サブクエリをに変換する場合、サブクエリLEFT JOINの相関WHERE条件は、次のON句ではなく、結合の句に移動しWHEREます。

SELECT  e.individual_ref, count(a.attr_Code_ref)
FROM    email e
LEFT JOIN
        attribute a
ON      a.individual_ref = e.individual_Ref
        AND a.attr_code_Ref = 4119 
WHERE   e.email_Address = 'example.email@adomain.net'
GROUP BY
        e.individual_ref
于 2010-02-09T13:53:52.893 に答える
0

最初のクエリでは、2つのテーブルを結合し、両方の条件に対応する行を探しています。行はありません。

2番目のクエリでは、最初のテーブルから電子メール条件に対応する行を取得し(1つあります)、他のテーブルから2番目の条件に対応する行の数は0です。

于 2010-02-09T13:42:36.277 に答える