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

时间:2015-02-05 10:08:43

标签: sql sybase

我的表包含以下数据:

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

目前表中的所有PAYCODE都是A,B,C,D。

但是,其他EMPCODE与其他新的PAYCODE(如E或F)可能会在稍后添加。

  • EMPCODE 001有PAYCODE A和B(他没有PAYCODE C和D)。
  • EMPCODE 002有PAYCODE A和C(他没有PAYCODE B和D)。
  • EMPCODE 003有PAYCODE B和D(他没有PAYCODE A和C)。

我想创建一个简单的存储过程/ 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存储过程来实现此目的?

欣赏答案。

2 个答案:

答案 0 :(得分:1)

使用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)从表中获取distinct EMPCODE

(SELECT EMPcode from Test GROUP BY EMPCODE) AS A 

2)从表中获取distinct PAYCODE

(SELECT Paycode FROM Test GROUP BY PAYCODE) AS B

3)获取每个PAYCODE的所有Empcode值。

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

答案 1 :(得分:0)

您可以通过在子查询中使用empcode生成paycodecross join的所有组合来执行此操作,然后将其用作左连接的派生表。要不插入现有行,您应使用相关的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来使用具有相同效果的非限定隐式连接。有关说明,请参阅此Wikipedia article