2015-07-09 44 views
-3

我有一個表,該表調用chqbook_tbl:SQL服務器從兩個範圍值生成row

CBID CBBankID  CBStartNo CBBookEndNo 
1   1   1   5 
2   1   21  25 
3   2   1  5 

我有另一個表chq_tbl如下

C_CBBankID  C_No  
    1   2  
    1   22 
    2   1 
    2   5 

現在我需要選擇記錄得到數據如下:

C_BankID C_No  C_Type 
    1   1  Dynamic 
    1   2  Static 
    1   3  Dynamic 
    1   4  Dynamic 
    1   5  Dynamic 
    1   21  Dynamic 
    1   22  Static 
    1   23  Dynamic 
    1   24  Dynamic 
    1   25  Dynamic 
    2   1  Static 
    2   2  Dynamic 
    2   3  Dynamic 
    2   4  Dynamic 
    2   5  Static 
+0

能否請你解釋一下,這些表是如何連接的,什麼邏輯將被用於獲取給定的輸出? – Shnugo

+0

你的問題不清楚。你是否想加入兩列,如果是的話,哪兩個。什麼決定了C_Type是靜態的還是動態的? –

+0

@Shnugo:在chqbook_tbl我有一個範圍爲每個CBBankID c_no例如CBBankID 2,我有5 C_No從另一個表(chq_tbl)從1到5我現在有一些記錄首先我需要從CBBankID選擇c_no然後除了記錄CBBankID並添加CBBankID記錄。 –

回答

1

可以使用數字表(如master..spt_values)來獲取所有的T他在CBStartNoCBBookEndNo指定的範圍內編號,然後左連接chq_tbl,並使用一個case表達式根據空值設置動態/靜態屬性。

這應該工作:

select 
    c1.CBBankID, 
    m.Number as C_No, 
    case when c2.C_No is null then 'Dynamic' else 'Static' end as C_Type 
from master..spt_values m 
join chqbook_tbl c1 on m.number between c1.CBStartNo and c1.CBBookEndNo 
left join chq_tbl c2 on m.number = c2.C_No and c1.CBBankID = c2.C_CBBankID 
where m.type = 'P' 

請注意,我用數字表僅持有值0-2047所以如果你需要更高的數字您應該構建一個合適的表或使用遞歸查詢生成的數字在飛行中。

Sample SQL Fiddle

+0

謝謝你,爲我工作更換記錄。 –

3

使用理貨表,您可以生成CBStartNoCBBookEnd之間的C_No秒。然後在chq_tbl上執行LEFT JOIN以確定該行是靜態還是動態。

SQL Fiddle

WITH E1(N) AS(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
), 
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), 
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), 
Tally(N) AS(
    SELECT TOP(SELECT MAX(CBBookEndNo) FROM chqbook_tbl) 
     ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
    FROM E4 
) 
SELECT 
    C_BankID = cb.CBBankID, 
    C_No = t.N, 
    C_Ttype = CASE WHEN ct.C_No IS NULL THEN 'Dynamic' ELSE 'Static' END 
FROM chqbook_tbl cb 
CROSS APPLY(
    SELECT N 
    FROM Tally 
    WHERE N BETWEEN cb.CBStartNo AND cb.CBBookEndNo 
)t 
LEFT JOIN chq_tbl ct 
    ON ct.CBBankID = cb.CBBankID 
    AND ct.C_No = t.N 
+0

謝謝,爲我工作。 –