4

クエリが別の (おそらく同一の) データベースにコピーされ、失敗したときに、クエリのバグであるべきものを見つけました。見た目はこんな感じ

SELECT  a.columnOne ,
    b.columnOne
FROM TableOne a
INNER JOIN TableTwo b
    ON a.id = b.id
WHERE a.Value = 0
ORDER BY a.ColumnOne ,
    b.ColumnTwo

「バグ」は、TableTwo に columnTwo (ORDER BY 句で使用される) という名前の列がないにもかかわらず、正常に実行されることです。少なくともデータベースの 1 つはそうしますが、もう 1 つは当然のように文句を言います。しかし、どちらも TableTwo.columnTwo を持っていないと確信しています。

TableOne には columnTwo という名前の列があることに言及する価値があるかもしれません。

これは簡単に修正できますが、これが長い間問題なく存在していたことに悩まされています。何が起こっているのでしょうか?(または、私が提供できるその他の情報はありますか?)

4

1 に答える 1

1

ORDER BY リストの列参照を SELECT リストで定義された列にバインドすると、列のあいまいさが無視され、列のプレフィックスが無視されることがあります。これにより、結果セットが予期しない順序で返される可能性があります。たとえば、SELECT リスト内の列への参照として使用される単一の 2 つの部分からなる列 (.) を持つ ORDER BY 句は受け入れられますが、テーブルのエイリアスは無視されます。次のクエリを検討してください。SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1 実行すると、ORDER BY の列プレフィックスは無視されます。指定されたソース列 (x.c1) で期待どおりに並べ替え操作が行われません。代わりに、クエリで定義されている派生 c1 列で発生します。

ソース - 「MSDN」

于 2013-06-10T08:23:57.853 に答える