我需要为我的公司制作邮寄标签,我想我会对此进行查询:
我有两张桌子 - tblAddress
,tblContact
。
在tblContact
中,我有“addressNum
”这是地址的外键,“labelsNum
”列表示地址应出现在标签表中的次数。< / p>
我需要通过tblcontact
创建tbladdress
和addressNum
的内部联接,
但如果labelsNum
存在多次,则应显示labelsNum
的次数。
答案 0 :(得分:0)
无论如何,脚本不会为不同的联系人返回多行吗?
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列,以保持一致。
标签数量已经由不同联系人的数量决定。
或者我错过了什么?
答案 1 :(得分:0)
我建议使用递归查询为每一行执行正确的迭代次数。
以下是代码(+ 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