aka55
@aka55 (岡田 彰太朗)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

SQLの外部参照について(2つの外部キーの指定方法)教えてください

Q&A

Closed

解決したいこと

エンジニア騎士とクエリの魔女というサイトにおけるSQLの問題の中で分からない部分があります。
SQLの外部参照で、2つの外部キーを参照する方法が分かりません。

問題文の中の以下の文章を表現する方法が分かりません。
「弱点はElementCompatibilityテーブルに格納されており、弱点に対応する属性名はelement_id、weakness_element_idを外部キーとしてElementテーブルを外部参照することで取得できます。」
こちらをどのようなSQL文で表現したらいいか教えていただきたいです。

以下問題になります。
スクリーンショット 2023-09-22 162033.jpg
スクリーンショット 2023-09-22 162058.jpg

該当するソースコード

SELECT
    Hell.id,
    Hell.name,
    Element.name as element,
    Grade.name as grade
from
    Hell
left outer join
    Element
on
    Hell.element_id = Element.id
left outer join
    ElementCompatibility
on
    ElementCompatibility.element_id = Element.id
and
    ElementCompatibility.weakness_element_id = Element.id
left outer join
    Grade
on
    Hell.grade_id = Grade.id
where
    Grade.name = "Boss"
;

自分で試したこと

外部参照を以下の書き方で試してみたのですが、期待する結果が得られません。

left outer join
    ElementCompatibility
on
    ElementCompatibility.element_id = Element.id
and
    ElementCompatibility.weakness_element_id = Element.id

スクリーンショット 2023-09-22 162704.jpg

0

2Answer

弱点はElementCompatibilityテーブルに格納されており、弱点に対応する属性名はelement_id、weakness_element_idを外部キーとしてElementテーブルを外部参照することで取得できます。

Graffiacaneの弱点属性は、こんな感じで取得できると思います。
(動かしてないので誤字脱字あったらすいません)

Graffiacaneのweakness_element_idを取得
SELECT ec.weakness_element_id
FROM Hell h
INNRE JOIN ElementCompatibility ec
ON e.eleent_id = ec.eleent_id 
WHERE h.name = 'Graffiacane'
1Like

Comments

  1. @aka55

    Questioner

    ありがとうございます!参考にさせていただきます。

ずばりクエリーを回答してよかったですか?(クリックすると見えます)
SELECT
	Hell.id,
	Hell.name,
	Element.name AS element,
	Grade.name AS grade
FROM
	Hell
INNER JOIN
    Grade
ON
    Hell.grade_id = Grade.id
INNER JOIN
    Element
ON
    Hell.element_id = Element.id
WHERE
    Hell.element_id IN (
		SELECT
			weakness_element_id
        FROM
            Hell
		INNER JOIN 
            ElementCompatibility
        ON
            Hell.element_id = ElementCompatibility.element_id
		WHERE
			name = 'Graffiacane'
    )
    AND
    Grade.name = 'Boss'
;

なお、動かしてはいません。

1Like

Comments

  1. @aka55

    Questioner

    ありがとうございます!参考にさせていただきます。

  2. もし、解決済みであれば、当Q&Aをクローズしてください。

Your answer might help someone💌