2015-07-09 48 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

谢谢,为我工作。 –