中間変数と条件節を使用せずに次のようなやり方が可能かどうか疑問です。countが1より大きい場合にのみ結合を実行する
行なし、1行または複数行のいずれかを含む結果セットを生成する中間クエリを考えてみます。たいていの場合、行は1つだけ生成されますが、複数の行がある場合は結果の行を別の表に結合して、1つまたは複数の行にプルーニングします。この後に、(行がない場合とは異なり)1つの行がある場合は、元の中間クエリによって生成された複数の列を返すことになります。
私は次のようなものがありますが、明らかに機能しません(スイッチの複数の列、結合などはありません)。私が望むのは、現在のSELECT
句にあるものを返すことです。@@ROWCOUNT = 1
の場合はINNER JOIN
からAuxilliary
になります。x
を1つの行または行なしにプルーンして返します。私はMain
とAuxilliary
をここではx
に複数の行が含まれている場合にのみ検索したくありません。
SELECT x.MainId, x.Data1, x.Data2, x.Data3,
CASE
WHEN @@ROWCOUNT IS NOT NULL AND @@ROWCOUNT = 1 THEN
1
WHEN @@ROWCOUNT IS NOT NULL AND @@ROWCOUNT > 1 THEN
-- Use here @id or MainId to join to Auxilliary and there
-- FilteringCondition = @filteringCondition to prune x to either
-- one or zero rows.
END
FROM
(
SELECT
MainId,
Data1,
Data2,
Data3
FROM Main
WHERE
MainId = @id
) AS x;
CREATE TABLE Main
(
-- This Id may introduce more than row, so it is joined to
-- Auxilliary for further pruning with the given conditions.
MainId INT,
Data1 NVARCHAR(MAX) NOT NULL,
Data2 NVARCHAR(MAX) NOT NULL,
Data3 NVARCHAR(MAX) NOT NULL,
AuxilliaryId INT NOT NULL
);
CREATE TABLE Auxilliary
(
AuxilliaryId INT IDENTITY(1, 1) PRIMARY KEY,
FilteringCondition NVARCHAR(1000) NOT NULL
);
一時テーブル変数と条件付きのクエリが1つのクエリで可能ですか? CTEを使用しないで?
いくつかのサンプルデータが
INSERT INTO Auxilliary(FilteringCondition)
VALUES
(N'SomeFilteringCondition1'),
(N'SomeFilteringCondition2'),
(N'SomeFilteringCondition3');
INSERT INTO Main(MainId, Data1, Data2, Data3, AuxilliaryId)
VALUES
(1, N'SomeMainData11', N'SomeMainData12', N'SomeMainData13', 1),
(1, N'SomeMainData21', N'SomeMainData22', N'SomeMainData23', 2),
(2, N'SomeMainData31', N'SomeMainData32', N'SomeMainData33', 3);
そして、私はそれが私が唯一と直接Main
を問い合わせる場合は参加したいと思うだろう警告して動作するように好きな実際に動作するサンプルクエリ、だろう与えられたIDは複数の結果を生成します。
DECLARE @id AS INT = 1;
DECLARE @filteringCondition AS NVARCHAR(1000) = N'SomeFilteringCondition1';
SELECT *
FROM
Main
INNER JOIN Auxilliary AS aux ON aux.AuxilliaryId = Main.AuxilliaryId
WHERE MainId = @id AND aux.FilteringCondition = @filteringCondition;
あるとき、あなたは質問を編集して、サンプル・データ、所望の結果を提供することができます。これは単一のクエリで行うことができると確信していますが、正確に何をしようとしているのか把握するのは難しいです。 –
確かに!私はそれをすぐに(十分に)しようとします! – Veksi
@GordonLinoff質問してくれてありがとう!私は実際にメインのIdが必ずしも一意ではないという点で、私の質問の欠陥にも気づいた。ここでの問題は、私が解決する方法を知っていると思う既存のデータベースに状況があることですが、私もその過程で自分自身を教育しようとしています。事は、参加を行うことはほとんどの時間が必要ではなく、パフォーマンスのためにむしろ問題になる可能性があるということです。次に、複数の結果をコードに返すことも問題です(アプリの変更やデータの大量のため)。 – Veksi