2017-05-29 13 views
0

私は1つのSQL文を分析しています。エイリアスに関しては、私には分からないものがあります。誰かがそれを説明しようとすることができるかどうか質問したいと思います。だから、これはあなたがエイリアスが句つのフィールドがある場合にはしかし、声明の中で、すべての3つのテーブルのために提供し、データ選択で常に使用だけでなく、参加している見ることができるように文がテーブルエイリアスが提供されていない場合、どのテーブルが使用されますか?

SELECT 
    a.RecordID 
    , a.Account 
    , b.RecordID 
    , c.SomeField as AlternativeFieldName 
FROM TableA a 
LEFT JOIN TableB b 
    ON a.RecordID=b.RecordID 
LEFT JOIN TableC c 
    ON b.RecordID=c.RecordID 
WHERE a.DayFrom >= YYYYMMDD and a.DayFrom < YYYYMMDD 
    AND b.Field1 is null 
    AND Field2 = 'SOME_VALUE' 

どのように見えるかですエイリアスが提供されていない上記のテーブルの1つから取得します。私はこれが正しいと思います.SQLがソーステーブルとして何を取っているのか、そうでなければエラーを投げますか?

このpageでは、何か似たようなことを試しましたが、実際にはうまくいきましたが、何らかのエラーが予想されました。 SQLは、複数のテーブルを結合する場合にエイリアスを使用するように強制していました。ここに文はありますか?

SELECT * 
FROM Customers c 
JOIN Orders o 
    ON c.CustomerID = o.CustomerID 
WHERE OrderDate = '1996-07-04' 

Thxは事前に賞賛です!

+3

カラム名があいまいであるとエラーが発生します。そうでなければ、クエリが機能します。 –

+0

OrderDateが1つのテーブルでのみ見つかっていてambiguoutyがなく、クエリが機能する場合 – GuidoG

答えて

3

SQL Server(または任意のデータベース)が修飾されていない列名を検出すると、FROM句内のどのテーブル/サブクエリか、または外部クエリがそれを提供しているかどうかを調べます。

カラムがFROM句の中の1つのテーブル/サブクエリに正確に含まれている場合、そのカラムはテーブル/サブクエリから来たものとみなされます。

カラムがFROM句の複数のテーブル/サブクエリにある場合、クエリはエラーを返します。

カラムがFROM句にも外側のクエリにも存在しない場合、クエリはエラーを返します。

カラムがFROM句に存在せず、外部クエリで存在する場合は、その参照が使用されます。

これらのルールは「スコープ」という名前で表示されます。これは、変数の値を計算するためのコンピュータ言語の一般的な用語です。

+0

すばらしい説明をありがとう! @Dan Guzmanからの回答も気に入っていますが、これは受け入れられる価値があります! – amsalk

0

ジョインでSQLクエリを実行するRDBMSは、すべての参照テーブルから列名を検索しようとします。その名前を持つ列が1つしか見つからない場合は、単に曖昧さエラーを使用してクエリを実行します。エイリアス名はあいまいさを避けるために使用されます。

2

列名があいまいでない限り、修飾されていない列名にはエラーは発生しません。あいまいな名前の場合は、エラーを回避するために、列名を表名または別名で修飾する必要があります。

また、列名が修飾されていない場合に問題になるスコープの概念もあります。この構造を考えてみましょう:Field4TableDに存在する場合

WHERE b.Field3 IN(
    SELECT Field4 
    FROM TableD 
    ) 

、望ましい結果が返されます。しかし、Field4がTableDに存在しないが外部テーブルの1つに存在する場合、Field4の値がNULLでなく、少なくとも1つの行がTableDに存在する場合、述語はすべての外部行に対して真となります。

つまり、複数テーブルのクエリで列名を修飾することをお勧めします。

関連する問題