如果您能提供任何帮助,我们将不胜感激。
我有以下两张表
TS_DEF_TRADER:
DEF_TRADER_ID MANAGER_CD INV_CLASS_CD TRADER_CD
------ ------- ---------- ---------
101 HARRIT EQTY MMGR_DT
108 NAIDON EQTY MMGR_DT
123 MLONDG EQTY MMGR_DT
和 PDF_USER_GROUP:
GRP_CD USER_CD
------ -------
STANLIB_MULTI_MANAGER HARRIT
STANLIB_MULTI_MANAGER NAIDON
STANLIB_MULTI_MANAGER MLONDG
STANLIB_MULTI_MANAGER FARRYM
STANLIB_MULTI_MANAGER HOLMEM
我想要做的是创建某种循环 SQL 插入语句(如果这是正确的术语),该语句将检查 PDF_USER_GROUP 以及 TS_DEF_TRADER 中是否缺少 GRP_CD = STANLIB_MULTI_MANAGER 的 USER_CD。如果缺少任何内容,它将插入相关行。
我写了以下声明:
declare @DefTraderID INT
declare @Mgr varchar(200)
set @DefTraderID = (select MAX(DEF_TRADER_ID) + 1 from TS_DEF_TRADER)
set @Mgr = (select min(USER_CD) from PDF_USER_GROUP where not exists
(select * from TS_DEF_TRADER where
TRADER_CD = 'MMGR_DT' and
INV_CLASS_CD = 'EQTY' and
TS_DEF_TRADER.MANAGER_CD = PDF_USER_GROUP.USER_CD)
and GRP_CD = 'STANLIB_MULTI_MANAGER' and USER_CD not in ('MMGR_DT', 'SLIB_INDEX'))
insert into TS_DEF_TRADER (DEF_TRADER_ID,MANAGER_CD,INV_CLASS_CD, TRADER_CD)
values (@DefTraderID,@Mgr, 'EQTY', 'MMGR_DT')
如果我自己手动运行两次,我会得到以下结果,这正是我想要的:
DEF_TRADER_ID MANAGER_CD INV_CLASS_CD TRADER_CD
------ ------- ---------- ---------
101 HARRIT EQTY MMGR_DT
108 NAIDON EQTY MMGR_DT
123 MLONDG EQTY MMGR_DT
124 FARRYM EQTY MMGR_DT
125 HOLMEM EQTY MMGR_DT
如果我第三次运行它,就会发生这种情况:
DEF_TRADER_ID MANAGER_CD INV_CLASS_CD TRADER_CD
------ ------- ---------- ---------
101 HARRIT EQTY MMGR_DT
108 NAIDON EQTY MMGR_DT
123 MLONDG EQTY MMGR_DT
124 FARRYM EQTY MMGR_DT
125 HOLMEM EQTY MMGR_DT
126 NULL EQTY MMGR_DT
我需要它自行运行(即:循环)并在需要时停止一次,这样我们就不会得到 NULL。
最佳答案
这根本不需要循环,您只需执行一个 INSERT
语句即可:
DECLARE @MaxDefTraderId INT
SELECT @MaxDefTraderId = MAX(DEF_TRADER_ID)
FROM TS_DEF_TRADER
INSERT INTO TS_DEF_TRADER(DEF_TRADER_ID, MANAGER_CD, INV_CLASS_CD, TRADER_CD)
SELECT @MaxDefTraderId + ROW_NUMBER() OVER(ORDER BY USER_CD) DEF_TRADER_ID,
USER_CD MANAGER_CD,
'EQTY' INV_CLASS_CD,
'MMGR_DT' TRADER_CD
FROM PDF_USER_GROUP A
WHERE GRP_CD = 'STANLIB_MULTI_MANAGER'
AND NOT EXISTS(SELECT 1 FROM TS_DEF_TRADER
WHERE MANAGER_CD = A.USER_CD)
Here is a demo有了这个。结果是:
╔═══════════════╦════════════╦══════════════╦═══════════╗
║ DEF_TRADER_ID ║ MANAGER_CD ║ INV_CLASS_CD ║ TRADER_CD ║
╠═══════════════╬════════════╬══════════════╬═══════════╣
║ 101 ║ HARRIT ║ EQTY ║ MMGR_DT ║
║ 108 ║ NAIDON ║ EQTY ║ MMGR_DT ║
║ 123 ║ MLONDG ║ EQTY ║ MMGR_DT ║
║ 124 ║ FARRYM ║ EQTY ║ MMGR_DT ║
║ 125 ║ HOLMEM ║ EQTY ║ MMGR_DT ║
╚═══════════════╩════════════╩══════════════╩═══════════╝
现在,我需要警告您计算 DEF_TRADER_ID
的方式。您应该使用 IDENTITY
列,而不是以这种方式分配值。当另一个用户尝试向该表插入值时会发生什么?您可能会插入重复的 id。
关于sql - SQL Server 2008 中的循环插入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555226/