それはできますか?
SQL Serverでは、同じステートメントで結果セットを選択し、変数を設定することはできません (MySQL では可能ですが)。ごめん。しかし、あなたが望むものを手に入れる別の方法があるかもしれません。残念ながら、あなたが望むものは完全には明らかではありません。
SELECT を実行し、同時に別の値を変数に返したいと仮定すると、クエリが複数の行を返す可能性があるという問題を処理する必要があるため、その場合、どれを に返し@SubkindId
ますか?
さて、私は誤解しているかもしれません.列の値を変数に取り込もうとする代わりに、代わりに、変数に既にある値とSubkindId
一致する行のみを取りたいと思います(最初に値を割り当てることを示していませんでしたが)であるため、可能性は低いと思われます)。
どちらが該当するかを確認し、上記の質問にお答えください。さらにサポートさせていただきます。
それまでの間、両方のシナリオについてお答えします。
IN()
まず、 ID のリストを返すサブクエリで構文を使用しないことをお勧めします。私の意見では、それは通常、その人が適切に JOIN する方法を本当に知らないことを示しているため、お粗末な方法であり、クエリが少し複雑になるとすぐに、その人だけでなく、最高のプロの SQL Server クエリ ライターでさえ取得できます。(... WHERE x IN (SELECT ... WHERE y IN (SELECT ... WHERE z NOT IN (...)))
すぐに重大な事件につながる失われたもの!?!?!?! . JOIN のみを使用し、必要に応じてセミ結合 (EXISTS 句で導入) を使用します。
クエリを実行して値を返す
結合中に SELECT ステートメントが見つけた値にアクセスすることが本当に必要な場合は、次のようになります。
DECLARE @KindsAndSubkinds TABLE (
Name varchar(100),
SubkindId tinyint
);
INSERT @KindsAndSubkinds
SELECT
T1.Name,
T2.SubkindId
FROM
dbo.SampleTable001 T1
INNER JOIN dbo.SampleTable002 T2
ON T1.Id = T2.Id
SELECT DISTINCT Name
FROM @KindsAndSubkinds
ORDER BY Name;
-- Now you can something with the `SubkindId`s in the @KindsAndSubkinds table variable.
クエリするだけ
値を返すのではなく、クエリを実行するだけの場合は、次の方法をお勧めします。
DECLARE @SubkindId as tinyint;
SET @SubkindId = 5;
SELECT
T1.Name
FROM
dbo.SampleTable001 T1
INNER JOIN dbo.SampleTable002 T2
ON T1.Id = T2.Id
WHERE
T2.Subkind = @SubkindId
ORDER BY
T1.Name;
SampleTable002 に複数の行があるが、それらを結果セットに含めたくない場合は、次のようにします。
SELECT
T1.Name
FROM
dbo.SampleTable001 T1
WHERE
EXISTS (
-- This semi-join requires at least one row to exist
-- but doesn't increase the row count
SELECT *
FROM dbo.SampleTable002 T2
WHERE
T1.Id = T2.Id
AND T2.Subkind = @SubkindId
)
ORDER BY
T1.Name;
これが役立つことを願っています。