SQL 过程(Sybase Advantage 数据库服务器)

SQL Procedure (Sybase Advantage Database Server)

我 table 包含以下数据:

EMPCODE  PAYCODE  AMOUNT
------------------------
001      A        100
001      B        200
002      A        120
002      C         80
003      B         50
003      D         20   

目前table中的所有PAYCODE都是A、B、C、D。

但是,以后可能会添加其他 EMPCODE 和其他新的 PAYCODE,例如 E 或 F。

我想创建一个简单的存储过程/SQL,它可以为他们不拥有的 PAYCODE 的每个 EMPCODE 添加虚拟记录。

我的预期结果如下:

EMPCODE  PAYCODE  AMOUNT
------------------------
001      A        100
001      B        200
001      C          0
001      D          0
002      A        120
002      B          0
002      C         80
002      D          0
003      A          0
003      B         50
003      C          0
003      D         20  

我可以通过编码实现,但我需要通过存储过程来实现。

是否有任何 SQL 存储过程可以实现此目的?

感谢您的回答。

使用Join得到结果。 SQLFiddle

SELECT C.EMPCODE, C.PAYCODE, ISNULL(D.AMOUNT, 0) AS AMOUNT FROM 
(
    SELECT * FROM
        (SELECT EMPcode from Test GROUP BY EMPCODE) AS A,
        (SELECT Paycode FROM Test GROUP BY PAYCODE) AS B
) AS C
LEFT JOIN Test AS D
ON C.EMPCODE=D.EMPCODE AND C.PAYCODE = D.PAYCODE

更新:

1) 从 table

得到 distinct EMPCODE
(SELECT EMPcode from Test GROUP BY EMPCODE) AS A 

2) 从 table

得到 distinct PAYCODE
(SELECT Paycode FROM Test GROUP BY PAYCODE) AS B

3) 获取每个 Empcode.

的全部 PAYCODE
SELECT * FROM
        (SELECT EMPcode from Test GROUP BY EMPCODE) AS A,
        (SELECT Paycode FROM Test GROUP BY PAYCODE) AS B

您可以通过在子查询中使用 cross join 生成 empcodepaycode 的所有组合来执行此操作,然后将其用作派生的 table对于左连接。要不插入已经存在的行,您应该使用相关的 not exists 谓词排除它们。写成一个存储过程它可能是这样的:

create proc insert_missing_values as 
insert your_table (empcode, paycode, amount)
select distinct codes.empcode, codes.paycode, isnull(your_table.amount, 0) amount 
from (
    select t1.empcode, t2.paycode 
    from your_table t1, your_table t2
    group by t1.empcode, t2.paycode
    ) codes    
left join your_table on 
  codes.empcode = your_table.empcode 
  and 
  codes.paycode = your_table.paycode
where not exists (
    select 1 from your_table 
    where codes.empcode = your_table.empcode and codes.paycode = your_table.paycode
    )

Sample SQL Fiddle

编辑:由于 Sybase ASE 不支持显式 cross join 您可以使用具有相同效果的非限定隐式连接,方法是执行 from TableA, TableB 其中 returns 行的笛卡尔积.请参阅此 Wikipedia article 以获取解释。