2012-05-09 16 views
-2

複雑なクエリがあり、正しい答えを得ることができません。 、(INTとしてPK名VARCHARとして、...)非常に複雑なSQLクエリ

接触
セッション(INTとしてPK接触INTとして
は、3つのテーブルがあります。 ..)
メッセージpkとしてINT、セッションとしてINT、...)

session.contactcontact.pkを指します。そしてmessage.sessionsession.pk
session.contactがゼロの場合、この行の連絡先はありません。 contact.pkは決してゼロではありません。

今、特定のメッセージのすべての名前を取得したいと思います。

SELECT message.pk、メッセージからcontact.name、セッション、WHERE message.session = session.pk AND session.contact = contact.pk

に連絡しかし、私はdidnの:私の試みは、このました正しい行数が返されます。それは2459でなければならず、2075年です。

+9

A)それは非常に複雑ではありません。 b)正しい答えがどのように分かっていますか?試験問題ですか? –

+0

私はテーブルを外部から参加させる必要があると思う(つまり、あなたの例では 'session.contact = contact.pk'は一致するものを見つけるつもりはない)。 – Marc

+1

連絡先のないレコードを取得しようとしていますか?あなたの現在のクエリはそれらを取得しません。それはあなたの不足かもしれない –

答えて

2

まず、正しい行数はどのように分かりますか?

第二に、あなたは以下に似た適切なJOINな構文を使用する必要があります。

SELECT message.pk, contact.name 
FROM message m 
LEFT JOIN session s 
    on m.session = s.pk 
LEFT JOIN contact c 
    on s.contact = c.pk 
+0

JOIN構文を使用することに同意、はるかに読みやすくなります。 – barnyr

+3

あまりにも悪いことに彼の結果を変えることはありません –

+0

@Shredder真ですが、未来のために正しい道を辿るのは良い考えですか? – Bridge