1

会社の宛名ラベルを作成する必要があり、そのためのクエリを実行すると思いました。

私は2つのテーブルを持っています - tblAddresstblContact

アドレスの外部キーである " " と、ラベル シートにアドレスが表示される回数を表す " tblContact"列があります。addressNumlabelsNum

tblcontactand tbladdressbyの内部結合を作成する必要がありますが、複数回存在するaddressNum場合は、その回数だけ表示する必要があります。labelsNumlabelsNum

4

2 に答える 2

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 に 3 番目の連絡先を追加する場合、一貫性を保つために、foo2 を参照するすべてのレコードのすべての labelsNum 列を更新する必要があります。

ラベルの量は、さまざまな連絡先の量によって既に決定されています。

または、何か不足していますか?

于 2012-10-10T10:10:38.270 に答える
0

再帰クエリを使用して、各行の反復回数を正しくすることをお勧めします。

コードは次のとおりです(+ SQLフィドルへのリンク):

;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
于 2012-10-10T10:12:20.203 に答える