0

と という 2 つのテーブルがComputerReportありSoftwareReportます。最初のテーブルでは、 という整数列を追加しましたSFID。この列を使用して、最初のテーブルと 2 番目のテーブルをリンクします。2 番目のテーブルにも という名前の列がSFIDあり、これはテーブルの主キーでもあります。

私が欲しいのはSFID、テーブルの列をSoftwareReportSFID列に埋めることですComputerReport。下の図には 2 つのテーブルが表示されていますが、のSFID列はComputerReportですNULL

SoftwareReport表の IDを のSFID列に入力するにはどうすればよいですかComputerReport。存在しない場合は、プログラム名のみを追加する必要があります。

画像のリンクは次のとおりです。http://i33.tinypic.com/2usewr8.jpg

ありがとう、

ジェイミー

4

4 に答える 4

2

ソフトウェア レポート テーブルの最初の項目で最初のコンピューター レポートを更新し、2 番目の項目で 2 番目、3 番目の項目で 3 番目の項目を更新するだけのロジックの場合、これはうまくいきます。

WITH CR AS
(   SELECT  CRID, Name, SFID, rn = ROW_NUMBER() OVER(ORDER BY CRID) 
    FROM    ComputerReport
), SF AS
(   SELECT  SFID, Name, rn = ROW_NUMBER() OVER(ORDER BY SFID)
    FROM    SoftwareReport
)
MERGE INTO CR
USING SF
    ON sf.rn = cr.rn
WHEN MATCHED THEN 
    UPDATE SET SFID = sf.SFID
WHEN NOT MATCHED THEN
    INSERT (Name, SFID) VALUES (sf.Name, sf.sfID);

これは、SFID の場合、ソフトウェア テーブルの対応する行でコンピュータ レポート テーブルを更新するだけです。ソフトウェア レポート テーブルに追加の行がある場合、新しい行が computerreport テーブルに追加されるため、行数が一致します。

SQL Fiddle の例

于 2013-04-25T09:48:46.077 に答える
1

通常、すでに挿入されている行を更新するのではなくComputerReport、正しい決定済みの行を挿入する必要があります。SFID

INSERT INTO ComputerReport
(SFID, CrComputerName, CrLastUpdatedBy) -- add other columns as neeeded 
SELECT SFID, 'JAMI-HP', 'JAMIE-HP\JAMIE'
FROM SoftwareReport

ComputerReportテーブルにまだ価値のあるものが含まれていない場合は、テーブルを切り捨てて上記の挿入を行うことができます。

それ以外の場合は、各テーブルを追跡するカーソルが必要であり、カーソル位置の最初のテーブルSFIDの値に従って、カーソル位置の 2 番目のテーブルに設定します。SFID

理想的な状況では、行を作成したばかりで、どちらのテーブルにもギャップがなく、両方に同じ数の行が含まれているため、単純に次のように記述できます。

UPDATE ComputerReport 
SET SFID = CRID

しかし、一般的なケースでは、より複雑なスクリプトに頼る必要があります。

DECLARE @sfid, @crid

DECLARE sfcursor READONLY
FOR SELECT SFID
    FROM SoftwareReport
    WHERE SFName IS NOT NULL
    ORDER BY SFID ASC;
DECLARE crcursor
FOR SELECT CRID
    FROM  ComputerReport
    -- WHERE SFID IS NULL
    ORDER BY CRID ASC
FOR UPDATE SFID;

OPEN sfcursor;
OPEN crcursor;

FETCH NEXT FROM sfcursor INTO @sfid;
FETCH NEXT FROM crcursor INTO @crid;

-- update for each rows until we reach the end of either cursor
WHILE @@FETCH_STATUS = 0
     BEGIN
     UPDATE crcursor SET SFID = @sfid;
     FETCH NEXT FROM sfcursor INTO @sfid
     FETCH NEXT FROM crcursor INTO @crid
     END

-- if there are remaining rows in sfcursor, insert new rows in ComputerReport

FETCH RELATIVE 0 FROM sfcursor INTO @sfid
WHILE @@FETCH_STATUS = 0
    BEGIN
    INSERT INTO ComputerReport (SFID) -- you should add the other columns here as needed
    VALUES (@sfid);
    FETCH NEXT FROM sfcursor INTO @sfid
    END

CLOSE crcursor
CLOSE sfcursor
DEALLOCATE sfcursor
DEALLOCATE crcursor

スクリプトで示されているように、必要な列と値をINSERT使用して余分な行のクエリを修正する必要があります。ComputerReport

カーソル ベースのスクリプトは、通常の (セット ベースの) クエリに比べて遅いことに注意してください。参考文献:

于 2013-04-25T09:20:48.380 に答える
0

質問が本当によくわかりません。私の答えが関係ない場合は申し訳ありません。私が理解したように、あなたはコンピュータとソフトウェアをリンクしたいと考えています。このためには、多対多の関係が必要です。1 つのソフトウェアが複数のコンピューターに存在する可能性があり、1 つのコンピューターに多数のソフトウェアが存在する可能性があるためです。これを実現するには、次の 2 つの列で構成される別のテーブルが必要です: ComputerSoftware (CID, SFID)。たとえば、ID が 1 のコンピュータに ID が 2 と 3 のソフトウェアがある場合、ComputerSoftware テーブルに (1, 2) と (1, 3) を挿入する必要があります。

于 2013-04-25T10:21:19.213 に答える
0

これを正しく達成したい場合は、CRID を SoftwareReport テーブルに追加し、ComputerReport から SFID を削除する必要があります。

次に、新しいソフトウェア レポートを追加するときに、前回のレポートの CRID を使用します...

これを達成したい場合、これは有効です。チェックを実行するたびに、新しいコンピューターレポートが作成され、発生したときに接続された新しいソフトウェアが共通リストに追加されます。つまり、どのコンピューターレポートが新しいソフトウェアを報告したかです。

于 2013-04-25T09:18:00.407 に答える