SQL - 多次选择所选行

时间:2012-10-10 09:52:59

标签: sql report row

我需要为我的公司制作邮寄标签,我想我会对此进行查询:

我有两张桌子 - tblAddresstblContact

tblContact中,我有“addressNum”这是地址的外键,“labelsNum”列表示地址应出现在标签表中的次数。< / p>

我需要通过tblcontact创建tbladdressaddressNum的内部联接, 但如果labelsNum存在多次,则应显示labelsNum的次数。

2 个答案:

答案 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