クエリ内から変数を設定/読み取ることは可能ですか?
擬似コード:
SELECT animal_name,
@tallest_animal = (select top 1 height from animal order by height desc) as tallest,
@smallest_animal = (select top 1 height from animal order by height asc) as smallest
FROM animals
WHERE height BETWEEN @smallest_animal AND @tallest_animal
クエリを変えることで結果が得られることはわかっています。私の質問の実際の使用法を説明するのは難しすぎます。
問題のMicrosoftSQLServerです。 :)
はい、クエリ内で変数を設定できます。あなたの構文は実際にはかなり近いです。
そのためには、次のものが必要です。
SELECT @YourVariable = Column
FROM Animals
注:フィールドを変数に割り当てるときにASを使用することはできません。
クエリのすべてのフィールドが変数に割り当てられていることを確認する必要があります。そうしないと、次のエラーが発生します。
変数に値を割り当てるSELECTステートメントは、データ取得操作と組み合わせてはなりません。
これを克服するには、AnimalNameを@AnimalName変数に割り当てるだけです。
編集:
DECLARE @AnimalName VARCHAR(20)
DECLARE @TallestAnimal INT
DECLARE @SmallestAnimal INT
SELECT @AnimalName = animal_name,
@TallestAnimal = (select top 1 height from animal order by height desc),
@SmallestAnimal = (select top 1 height from animal order by height asc)
FROM animals
WHERE height BETWEEN @SmallestAnimal AND @TallestAnimal
このコードは、高さフィールドがINT型であることを前提としています。
いいえ、できません。代わりに次のように使用してください。
DECLARE @tallest_animal int, @smallest_animal int
SET @tallest_animal=(SELECT max(height) from animals)
SET @smallest_animal=(SELECT min(height) from animals)
SELECT animal_name from animals where height between @tallest_animal AND @smallest_animal
このようなものは機能しますが、あなたが何を探しているのかわかりません。
変数の代わりに派生テーブルを使用できます。
select A.animal_name, M.tallest, M.smallest
from animals A
inner join
(
select max(height) as tallest,
min(height) as smallest
from animal
) M
on A.height between M.smallest and M.tallest
Selectステートメントで変数に値を割り当てて同じSELECTステートメントで結果セットを返すことはできません。これはSQLServerの制限です。できたら素晴らしいと思いませんか!
単一のステートメントが必要な場合、なぜここで変数を使用したいのですか?次のことはあなたのために働きませんか?
WITH cte (tallest, smallest) AS (
SELECT MAX(height), MIN(height) FROM animals
)
SELECT animal_name FROM animals, cte WHERE height BETWEEN smallest AND tallest
後でストアドプロシージャで変数を使用する場合は、2つのselectステートメントを使用するしかありません。1つは割り当て用、もう1つはselect用です。
DECLARE @tallest INT, @smallest INT
SELECT @tallest = MAX(height), @smallest = MIN(height) FROM animals
SELECT animal_name FROM animals WHERE height BETWEEN @smallest AND @tallest
ADOを使用する場合、ADOコマンドで複合クエリを使用できます。つまり、コマンドコンポーネントに複数のステートメントを含めることができるため、上記の両方のソリューションが機能することに注意してください。