2

SQL ServerIN演算子を使用し、変数を列の値に設定します。これは可能ですか?

私のコードは次のようなものです:

DECLARE @SubkindId as tinyint;

SELECT NAME FROM SampleTable001 WHERE 
Id in (SELECT Id, @SubkindId = Subkind FROM SampleTable002)
ORDER BY Name;

私の問題は、 @SubkindId 変数を内側の select ステートメントに設定したいということです。

4

2 に答える 2

2

それはできますか?

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;

これが役立つことを願っています。

于 2012-08-21T06:17:30.640 に答える
0

次のようにします。

DECLARE @SubkindId as tinyint

SELECT [NAME] 
FROM SampleTable001 
WHERE  Id in (SELECT Id 
              from SampleTable002
              WHERE Subkind=@SubkindId)
order by [Name] 

または使用してJOIN

DECLARE @SubkindId as tinyint

SELECT [NAME] 
FROM SampleTable001 a 
        INNER JOIN  SampleTable002 b
          ON a.id = b.id
WHERE b.Subkind=@SubkindId
order by [Name] 
于 2012-08-21T06:17:56.833 に答える