Sql server SQL Server从两个范围值生成行

Sql server SQL Server从两个范围值生成行,sql-server,Sql Server,我有一张桌子叫chqbook_tbl: 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

我有一张桌子叫chqbook_tbl:

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

您可以使用数字表(如master..spt_values)获取CBStartNo和CBBookEndNo指定范围内的所有数字,然后左键联接chq_tbl,并使用大小写表达式根据空值设置动态/静态属性

这应该起作用:

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'
请注意,我使用的numbers表只保存值0-2047,因此如果需要更高的数字,您应该构造一个合适的表,或者使用递归查询动态生成数字


使用理货表,您可以在CBStartNo和CBBOOK END之间生成C_编号。然后在chq_tbl上执行左连接,以确定行是静态的还是动态的


请您解释一下,这些表是如何连接的,以及使用什么逻辑来获得给定的输出?您的问题不清楚。您正在尝试连接两列,如果是,请连接哪两列。什么决定了C_类型是静态的还是动态的?@Shnugo:在chqbook_tbl上,我为每个CBBankID(例如CBBankID 2)的C_编号设置了一个范围,我在另一张表上有5个从1到5的C_编号chq_tbl我现在有一些记录我需要先从CBBankID中选择C_编号,然后从CBBankID中选择除C_编号外的其他记录并添加CBBankID记录。@JosephGagliardo:动态记录不在chq_tbl中,并且动态是从C_noSorry的范围CBSTARTNO到CBBookEndNo中选择的行。我试图帮助你,但我仍然我不知道你的商业逻辑是什么。谢谢,为我工作。谢谢,也为我工作。
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