2011-07-26 3 views
2

SELECTクエリの定数の意味は何ですか? 2クエリの下を考慮

1)

USE AdventureWorks 
GO 
SELECT a.ProductID, a.ListPrice 
FROM Production.Product a 
WHERE EXISTS (SELECT 1 FROM Sales.SalesOrderDetail b 
      WHERE b.ProductID = a.ProductID) 

2)

USE AdventureWorks 
GO 
SELECT a.ProductID, a.Name, b.SalesOrderID 
FROM Production.Product a LEFT OUTER JOIN Sales.SalesOrderDetail b 
ON a.ProductID = b.ProductID 
ORDER BY 1 

私の唯一の問題は、数これらのクエリでの意味が何であるかを知っているのですか?どうすれば2つに変えてもらえますか?

ありがとうございました

+3

試しましたか?パターンに気付いたことがありますか? –

答えて

7

最初のケースでは問題ありません。それは存在クエリであるため、実際には2つまたは何かを選択することができます。一般に、定数を選択することは、存在クエリ以外のもの(結果セットの列に定数をドロップする)にも使用できますが、存在クエリは定数に遭遇する可能性が最も高い場所です。表与え例えば

は、3つの列、idfirstnamelastname、およびbirthdateを含むpersonと呼ばれる、あなたこのようなクエリを記述することができます。

select firstname, 'YAY' 
from person 
where month(birthdate) = 6; 

、これは

のようなものを返します
name  'YAY' 
--------------- 
Ani  YAY 
Sipho  YAY 
Hiro  YAY 

有用ではありませんが、可能です。考えられるのは、select文での式を選択するということです。これは列名だけでなく、定数や関数呼び出しでも可能です。可能性が高い場合には、次のとおりです。

select lastname||','||firstname, year(birthday) 
from person; 

ここ||は、文字列連結演算子であり、そしてyearは私が作っ機能です。

存在クエリに1が表示されることがある理由はこれです。名前が「H」で始まった人がいるかどうかを知りたがっているとしますが、あなたはこの人が誰であったかは気にしませんでした。あなたは

select id 
from person 
where lastname like 'H%'; 

を言うことができるが、我々はIDを必要としないので、あなたが気にすべてはあなたが空でない結果が設定され得るかどうかかではないので、あなたも

select 1 
from person 
where lastname like 'H%'; 

を言うことができます。

2番目の場合、1は列番号です。結果が最初の列の値でソートされることを意味します。それを2に変更すると、2番目の列が順番になります。

ところで、定数が選択される別の場所は、NOSQLのようなシステムで処理される非常に非正規化されたCSVファイルにリレーショナルデータベースからダンプするときです。

+0

申し訳ありませんが、私はあなたが1の最初の使い方について何を言ったのか分かりませんでした。 – Richard77

+0

申し訳ありませんが、私は編集で展開します。 –

0

実際、実際の列を使用する代わりに1のような定数を使用する理由は、実際に列の値を取得するI/Oを避けるためです。これによりパフォーマンスが向上する可能性があります。

1

第2のケースでは、1はリテラルではありません。むしろ、結果セットが最初の列でソートされることを示す序数です。 14に変更した場合、結果セットには3つの列しかないため、クエリはエラーで失敗します。

関連する問題