2016-12-07 3 views
0

特に複数の結合を持つSQL文の場合、SQL文のHAVINGコンポーネントがどのように機能するかを明確にしたいと考えました。私はレコードがWHERE要件のすべてを持っているtbl_person、から、レコードを引き出すしたいACCESS SQLでHAVINGを使用することについての質問

SELECT 
    p.id, 
    p.first_name as [First Name], 
    p.last_name as [Last Name] 
FROM 
    ([tbl_person] as p 
INNER JOIN [tbl_person_languages] as pl 
    ON [p].[id] = [pl].[person_id]) 
INNER JOIN [tbl_person_crossCuttingSkills] As ccp 
    ON [p].[id] = [ccp].[person_id] 
WHERE 
    cint(pl.language_id) in (12,14) AND 
    cint(ccp.skill_id) in (55) 
GROUP BY 
    p.id, 
    p.first_name, 
    p.last_name 
HAVING 
    count(pl.language_id) =2 AND 
    count(ccp.skill_id) = 1 

:以下のSQL SELECT文を考えてみましょう。たとえば、私はイタリア語(ID 12)とスペイン語(ID 15)を話し、料理のスキル(55)を持つすべてのユーザーを選択したいと考えています。彼らは、1つ以上の要件だけでなく、すべての要件を満たす必要があります。私はこれがGROUP BYとHAVINGを使う場所であると仮定していました。持つ:言語に2つの選択肢があるので

count(pl.language_id) =2 

私は、カウント= 2を使用してWHERE句(12及び14)

そして、もう一つの価値があるので、私は

count(ccp.skill_id) = 1 

を使用WHERE句(55)に記述します。

これを行う正しい方法ですか?何らかの理由で、これはレコードを返しません(これらの要件に厳密に合致する人物の私のDBに1つのレコードがあります)。しかし、私がHAVINGを変更した場合:

count(pl.language_id) =2 AND 
count(ccp.skill_id) = 2 

これは問題なく動作します。どうしてこれなの?どのようにこれが正しく動作しないのか、何か他のことが起こっているという私の前提ですか?

+0

同じID、ファーストネーム、ラストネームを持つ人は、2つの言語と1つのスキルを持つ人はいません。あなたが言及したように、2つの言語と2つのスキルのインスタンスがあるかもしれません。 where句を指定すると、いくつの言語/スキルが表示されますか?少量のデータを提供することは可能ですか? – Reisclef

答えて

1

覚えているものcount()があります。 。 。 NULL以外の値を数えます。したがって、NULL以外の2つの値を数えている場合、カウントは同じです。

HAVING count(distinct pl.language_id) = 2 AND count(distinct ccp.skill_id) = 1 

をしかし、MS AccessのはCOUNT(DISTINCT)をサポートしていないので、それは、MS Accessで動作しません:

SQLのほとんどの方言では、実行してこの問題を解決することができます。

だから、もっと冗長にすることができます。あなたのケースでは:

HAVING SUM(iif(cint(pl.language_id) = 12, 1, 0)) > 0 AND 
     SUM(iif(cint(pl.language_id) = 14, 1, 0)) > 0 AND 
     SUM(iif(cint(ccp.skill_id) = 55, 1, 0)) > 0 

私はこのHAVING句は単純ではありませんごめんなさい。 は、ANSI機能により密接に整合する別のデータベース(SQL Server Expressなど)に切り替えることができます。

+0

同じ人物が同じ言語やスキルを複数回持つことはありません。私はまだこれがなぜ機能しないのかわからない。私はこれらの2つのlanaguate IDとスキルIDの人を持っていますが、空のデータセットを返します。 – jason

+0

これは、 'count(ccp.skill_id)'が2つの行が他のすべての条件と一致すると2を返すためです。 –

+0

私のSQLでこれを説明する方法はありますか?それとも、コードでこれを行うのが最善でしょうか?残念なことに、アクセスは私たちの唯一の選択肢です。 – jason

関連する問題