我不知道如果沒有使用中間變量和條件子句,下面的一些設計實例是否可能。只有在計數大於1的情況下才進行連接
考慮一箇中間查詢,它可以生成一個結果集,其中不包含行,一行或多行。大多數情況下,它只產生一行,但是當多行時,應該將結果行連接到另一個表,以將其修剪爲一行或無行。在此之後,如果有一行(而不是沒有行),則想要返回由原始中間查詢產生的多列。
我在腦海裏想了一些像下面這樣的東西,但它不會明顯的工作(在開關箱中有多列,沒有連接等),但也許它說明了這一點。我想要的只是在@@ROWCOUNT = 1
的情況下返回SELECT
子句中的當前條件,或者如果它更大,請執行INNER JOIN
至Auxilliary
,這會將x
修剪爲一行或無行,然後返回該行。我不想多次搜索Main
,只有當x
包含多行時,纔會搜索Auxilliary
。
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
);
這是可能的一個查詢沒有臨時表變量和條件?沒有使用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感謝您的詢問!我實際上也注意到我的問題也有一個缺陷,那就是Main in Id不一定是唯一的。這裏的事情是我在現有的數據庫中有一種情況,我想我知道如何解決,但我也試圖在這個過程中教育自己。事情是,大部分時間不需要進行連接,並且由於性能可能會造成問題。然後將多個結果返回給代碼也有問題(由於應用程序更改和大量數據)。 – Veksi