SQL过程(Sybase Advantage数据库服务器)
我的表格包含以下数据:SQL过程(Sybase Advantage数据库服务器),sql,sybase,Sql,Sybase,我的表格包含以下数据: EMPCODE PAYCODE AMOUNT ------------------------ 001 A 100 001 B 200 002 A 120 002 C 80 003 B 50 003 D 20 目前表中的所有工资代码都是A、B、C、D 不过,稍后可能会添加其他EMPCODE和其他新的付费代码,如E
EMPCODE PAYCODE AMOUNT
------------------------
001 A 100
001 B 200
002 A 120
002 C 80
003 B 50
003 D 20
目前表中的所有工资代码都是A、B、C、D
不过,稍后可能会添加其他EMPCODE和其他新的付费代码,如E或F
EMPCODE 001有付款代码A和B,他没有付款代码C和D。
EMPCODE 002有付款代码A和C,但没有付款代码B和D。
EMPCODE 003有付款代码B和D,他没有付款代码A和C。
我想创建一个简单的存储过程/SQL,它可以为每个EMPCODE为PAYCODE添加虚拟记录,而这些EMPCODE并不属于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获得结果
更新:
1从表中获取不同的EMP代码
(SELECT EMPcode from Test GROUP BY EMPCODE) AS A
(SELECT Paycode FROM Test GROUP BY PAYCODE) AS B
2从表中获取不同的付款代码
(SELECT EMPcode from Test GROUP BY EMPCODE) AS A
(SELECT Paycode FROM Test GROUP BY PAYCODE) AS B
3获取每个Empcode的所有PAYCODE值
您可以通过在子查询中使用交叉联接生成empcode和paycode的所有组合来实现这一点,然后将其用作左联接的派生表。要不插入已经存在的行,应使用相关的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
)
编辑:由于Sybase ASE不支持显式交叉联接,您可以使用非限定隐式联接,其效果与从表a、表B执行相同,表a、表B返回行的笛卡尔乘积。请看下面的解释。谢谢库马尔,这是工作。但您能否解释一下:选择*从RPTRX组中选择EMPCODE按EMPCODE作为A,从RPTRX组中选择PAYCODE按PAYCODE作为Bhi jpw,谢谢您的回答,但我的数据库引擎Sybase Advantage数据库服务器8.1无法识别交叉JOIN@btan哦,我不知道。实际上,您可以删除交叉连接关键字以达到相同的效果。我更新了我的答案以反映这一点。