none
サブクエリの列指定時のテーブル名省略について RRS feed

  • 質問

  • サブクエリの列指定時のテーブル名省略についての質問です。
    外側テーブルと内側のテーブルに同名の列があるときにテーブル名を省略した場合、最も内側のテーブルが優先されると考えても問題ないでしょうか?
    (そのように動いているように見えますがそれは保証されているのでしょうか?)

    以下は意味のないクエリですが、こういったことです。

    SELECT
    	*
    FROM
    	Tbl1
    WHERE
    	EXISTS(
    		SELECT
    			*
    		FROM
    			Tbl2
    		WHERE
    			Col1 = Tbl1.Col1 AND --このCol1はTbl2のCol1
    			EXISTS(
    				SELECT
    					*
    				FROM
    					Tbl3
    				WHERE
    					Col1 = Tbl2.Col1 --このCol1はTbl3のCol1
    			)
    	)


    2019年6月25日 12:55

すべての返信

  • こちらをご覧ください。

    サブクエリ (SQL Server)
    https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/subqueries?view=sql-server-2017


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2019年6月26日 0:56
  • hoge001さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    trapemiyaさんが提供したリンクによると、サブクエリで使用する列名の修飾を確認してください。

    一般的な規則としては、ステートメント内の列名は、同じレベルの FROM 句で参照しているテーブルで暗黙的に修飾されます。 
    サブクエリの FROM 句で参照しているテーブルに列名が存在しない場合、外側のクエリの FROM 句で参照しているテーブルで暗黙的に修飾されます。

    また、サブクエリで参照している列が、サブクエリの FROM 句で参照しているテーブルにない場合でも、外側のクエリの FROM 句で参照しているテーブルに存在すれば、エラーが発生することなくクエリが実行されます。 
    サブクエリで参照している列は、SQL Server により、外側のクエリのテーブル名で暗黙的に修飾されます。

    したがって、ロジックが正しく、列の所有権についてあまり考えないように、クエリで明示的に指定された列を常に使用できます。

    以下のスクリプトを参照してください。

    SELECT *
    FROM Tbl1
    WHERE EXISTS 
                                                    (SELECT *  FROM Tbl2 
                                                    WHERE Tbl2.Col1 = Tbl1.Col1 AND
                                                    EXISTS 
                                                                    (SELECT * FROM Tbl3
                                                                    WHERE Tbl3.Col1 = Tbl2.Col1)
                                                    )

    どうぞよろしくお願いします。


    MSDN/ TechNet Community Support Haruka

    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、
    ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年6月28日 6:06
    モデレータ