3

次のコード:

SELECT JaguarStartupTime, CPU, AmountOfRam, UpdatedOn, *
FROM dbo.MachineConfiguration
WHERE ServerName = 'WashingtonDC01'
AND UpdatedOn > '11/21/2012'
ORDER BY JaguarStartupTime DESC

エラーが発生します:Ambiguous column name 'JaguarStartupTime'

ただし、を削除ORDER BYすると機能します。さらに、ORDER BY以下のように、句の前にテーブルを付けると、次のように機能します。

SELECT JaguarStartupTime, CPU, AmountOfRam, UpdatedOn, *
FROM dbo.MachineConfiguration
WHERE ServerName = 'WashingtonDC01'
AND UpdatedOn > '11/21/2012'
ORDER BY dbo.MachineConfiguration.JaguarStartupTime DESC

これは私には決して意味がありませんでした。誰かが説明できますか?

4

2 に答える 2

8

クエリに*はSELECT句に(すべての列)が含まれているためです。SELECT句には列JaguarStartupTimeも含まれています。

レイマンの用語では、結果の取得では、列が2回表示され、サーバーが並べ替え順序を適用しようとすると、参照している列がわかりません。

*個人的には、列名の長いリストをリストすることを意味する場合でも、クエリでの使用を排除するようにクエリを変更します。これはベストプラクティスであり、この問題を回避します。


プレフィックスを付けたときに機能する理由については、MSDNのドキュメントでこれを見つけました。

SQL Serverでは、修飾された列名とエイリアスは、FROM句にリストされている列に解決されます。order_by_expressionが修飾されていない場合、値はSELECTステートメントにリストされているすべての列の中で一意である必要があります。

これは、SQLステートメントを実行プランに変換するためのDBエンジンの基盤となるメカニズムの一部にすぎません。

于 2012-11-26T19:29:31.773 に答える
1

ORDER BY JaguarStartupTime私は、あなたの質問の場合、両方の投影された列が実際には同じ基になる列を参照しているため、実際にはあいまいではないことに同意します。

ただし、一般的なケースでは、これが当てはまるという保証はありません。この接続アイテムへの応答で説明したように。たとえば、次のクエリでは、どちらを使用するかが明らかにあいまいです。

SELECT JaguarStartupTime,
       CPU AS JaguarStartupTime
FROM   dbo.MachineConfiguration
ORDER  BY JaguarStartupTime DESC 

構文検証の目的で、SQL Serverは、列名が本当にあいまいであるかどうかを判断するために列名の分析を行いません。some_name投影された列名のリストにそれによる順序付けが存在する場合、はsome_name一意である必要があります。これはANSI仕様に準拠しています

a<sort specification>にが含まれている場合<column name>、それT を含む列が1つだけ含まれ、その列を<column name>識別<sort specification>します。

列名をテーブル名で修飾すると、SQL Serverに対して、投影された列名ではなくソース列名で並べ替えることができるようになります。

SELECT name, name 
FROM master..spt_values v1
ORDER BY v1.name

さらに、次のクエリが許可されます。

select name, name 
FROM master..spt_values v1
ORDER BY name + ''

これがあいまいでない理由は、ORDER BY句内の列エイリアスは式ではなく単独でのみ使用できるため、上記のクエリでnameはエイリアスとして解釈できず、による順序付けとして解釈する必要があるためv1.nameです。

于 2012-11-26T22:12:52.210 に答える