我需要为我的公司制作邮寄标签,我想我会为此做一个查询:
我有 2 张桌子 - tblAddress
, tblContact
.
在tblContact
我有“ addressNum
”这是地址的外键和“ labelsNum
”列,表示地址应出现在标签表中的次数。
我需要创建tblcontact
and tbladdress
by的内部连接addressNum
,但如果labelsNum
存在不止一次,它应该按原样显示多次labelsNum
。
脚本不会为不同的联系人返回多行吗?
CREATE TABLE tblAddress (
AddressID int IDENTITY
, [Address] nvarchar(35)
);
CREATE TABLE tblContact (
ContactID int IDENTITY
, Contact nvarchar(35)
, AddressNum int
, labelsNum int
);
INSERT INTO tblAddress VALUES ('foo1');
INSERT INTO tblAddress VALUES ('foo2');
INSERT INTO tblContact VALUES ('bar1', 1, 1);
INSERT INTO tblContact VALUES ('bar2', 2, 2);
INSERT INTO tblContact VALUES ('bar3', 2, 2);
SELECT * FROM tblAddress a JOIN tblContact c ON a.AddressID = c.AddressNum
这在我的末端产生了 3 行。labelsNum 列对我来说似乎是多余的。如果为地址 foo2 添加第三个联系人,则必须更新所有引用 foo2 的记录的所有 labelsNum 列,以保持一致。
标签的数量已经由不同联系人的数量决定。
还是我错过了什么?
我建议使用递归查询为每一行进行正确的迭代次数。
这是代码(+ SQL fiddle的链接):
;WITH recurs AS (
SELECT *, 1 AS LEVEL
FROM tblContact
UNION ALL
SELECT t1.*, LEVEL + 1
FROM tblContact t1
INNER JOIN
recurs t2
ON t1.addressnum = t2.addressnum
AND t2.labelsnum > t2.LEVEL
)
SELECT *
FROM recurs
ORDER BY addressnum