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。
- 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 存储过程可以实现此目的?
感谢您的回答。
使用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
生成 empcode
和 paycode
的所有组合来执行此操作,然后将其用作派生的 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
)
编辑:由于 Sybase ASE 不支持显式 cross join
您可以使用具有相同效果的非限定隐式连接,方法是执行 from TableA, TableB
其中 returns 行的笛卡尔积.请参阅此 Wikipedia article 以获取解释。
我 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。
- 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 存储过程可以实现此目的?
感谢您的回答。
使用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
生成 empcode
和 paycode
的所有组合来执行此操作,然后将其用作派生的 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
)
编辑:由于 Sybase ASE 不支持显式 cross join
您可以使用具有相同效果的非限定隐式连接,方法是执行 from TableA, TableB
其中 returns 行的笛卡尔积.请参阅此 Wikipedia article 以获取解释。