8

次の 2 つのクエリのいずれかを選択する必要がある場合、どちらを選択し、その理由は次のとおりです。

UPDATE `table1` AS e
SET e.points = e.points+(
SELECT points FROM `table2` AS ep WHERE e.cardnbr=ep.cardnbr);

また:

UPDATE `table1` AS e
INNER JOIN
(
   SELECT points, cardnbr
   FROM `table2`  
) AS ep ON (e.cardnbr=ep.cardnbr)
SET e.points = e.points+ep.points;

テーブルの定義:

CREATE TABLE `table1` (
  `cardnbr` int(10) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `points` decimal(7,3) DEFAULT '0.000',
  `email` varchar(50) NOT NULL DEFAULT 'user@company.com',
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25205 DEFAULT CHARSET=latin1$$

CREATE TABLE `table2` (
  `cardnbr` int(10) DEFAULT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `points` decimal(7,3) DEFAULT '0.000',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$

更新: 両方とも問題を引き起こしています。最初は、一致しない行が NULL に更新されます。2 つ目は、最大値 999.9999 (10 進数の 7,3) に更新する原因となっています。PS cardnbr フィールドはキーではありません

4

2 に答える 2

2

私は2番目のものを好みます..その理由は

データベースを使用JOINすると、クエリに適した実行プランを作成して時間を節約できますが、サブクエリ(最初のものなど)はすべてのクエリを実行し、時間がかかる可能性のあるすべてのデータをロードします。

サブクエリは読みやすいと思いますが、パフォーマンスJOINに関してはより高速です...

于 2013-02-05T07:43:15.847 に答える
1

まず、あなたが自分自身を知ったように、2つのステートメントは同等ではありません。最初の行は、のすべての行を更新し、に関連する行がない行の値をtable1入れます。NULLtable2

したがって、2番目のクエリは、のすべての行を更新しないため、見栄えが良くなりますtable1。ただし、次のように、より単純な方法で記述できます。

UPDATE table1 AS e
  INNER JOIN table2 AS ep
      ON e.cardnbr = ep.cardnbr
SET e.points = e.points + ep.points ;

したがって、cardnbrの主キーがである場合は、2番目のクエリを使用するのが最適ですtable2。それは...ですか?

そうでない場合は、table2のどの値をtable1の更新に使用する必要がありますか(に追加points)?それらすべて?あなたはこれを使うことができます:

UPDATE table1 AS e
  INNER JOIN
  (  SELECT SUM(points) AS points, cardnbr
     FROM table2  
     GROUP BY cardnbr
  ) AS ep ON e.cardnbr = ep.cardnbr
SET 
    e.points = e.points + ep.points ;

そのうちの1つだけですか?必要に応じて、他の派生テーブルが必要になります。

于 2013-02-05T09:13:08.607 に答える