2016-07-28 6 views
2

ある条件の別の表の列のOIDを使用して、ある表の列(oid)を更新(参照)しようとしています。シーケンス内の別の列のIDに応じて列を参照します。

例:

Customer Table : 
------------------ 
CID name oid 
------------------- 
1 abc  null 
2 abc  null 
3 abc  null 
4 xyz  null 
-------------------- 

Order Table 
-------------- 
OID name 
-------------- 
10 abc 
11 abc 
12 abc 
13 xyz 
-------------- 

出力リレーは次のようになります。

Customer Table : 
------------------ 
CID name oid 
------------------- 
1 abc  10 
2 abc  11 
3 abc  12 
4 xyz  13 
-------------------- 

私が試してみましたが、次の

UPDATE customer as c, order as o 
    SET c.oid = o.OID 
    WHERE c.name = o.name; 
----------------------------- 
update customer INNER JOIN order on customer.name=Order.name 
SET customer.oid=Order.OID 
where customer.oid IS null; 

しかし

Customer Table : 
------------------ 
CID name oid 
------------------- 
1 abc  10 
2 abc  10 
3 abc  10 
4 xyz  13 
-------------------- 
0を次のように顧客テーブルが更新されています

答えて

2

アイデアがCustomerテーブルとOrderテーブル内の各エントリに行番号を割り当てることです。

したがって、これらの2つのテーブルの間にinner joinを作成すると、今のところ2つの条件があります(以前は1つのみでした)。

一つの条件は、nameであり、もう一つはあるrow_number

あなたはこのクエリで行くことができ

UPDATE Customer CT 
INNER JOIN (
    SELECT 
     customerTable.CID, 
     orderTable.OID FROM 
     (
      SELECT 
       *, 
       @rn1 := @rn1 + 1 AS row_number 
      FROM 
       Customer C 
      CROSS JOIN (SELECT @rn1 := 0) var 
      ORDER BY CID 
     ) AS customerTable 
    INNER JOIN (
     SELECT 
      *, 
      @rn2 := @rn2 + 1 AS row_number 
     FROM 
      `Order` O 
     CROSS JOIN (SELECT @rn2 := 0) var 
     ORDER BY OID 
    ) AS orderTable ON customerTable. NAME = orderTable. NAME 
    AND customerTable.row_number = orderTable.row_number 
) AS combinedTable ON CT.CID = combinedTable.CID 
SET CT.oid = combinedTable.OID 

注:nameの一致にこれら2つのテーブルを結合するとしている何のために十分ではありませんので、あなたは探しています。そのため、一致する名前に加えて、行のそれぞれにrow_numberを割り当てます(CustomerOrderのテーブルの両方)。namerow numberの一致でこれら2つのテーブルの内部結合を行います。したがって、1つのエントリを他のエントリ別のテーブルから


TESTスキーマ&は、DATA:。

は、SQLフィドルを追加できませんでした

DROP TABLE IF EXISTS `customer`; 
CREATE TABLE `customer` (
    `CID` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL, 
    `oid` int(11) DEFAULT NULL, 
    PRIMARY KEY (`CID`) 
); 
INSERT INTO `customer` VALUES ('1', 'abc', null); 
INSERT INTO `customer` VALUES ('2', 'abc', null); 
INSERT INTO `customer` VALUES ('3', 'abc', null); 
INSERT INTO `customer` VALUES ('4', 'xyz', null); 

DROP TABLE IF EXISTS `order`; 
CREATE TABLE `order` (
    `OID` int(11) NOT NULL, 
    `name` varchar(100) NOT NULL 
); 
INSERT INTO `order` VALUES ('10', 'abc'); 
INSERT INTO `order` VALUES ('11', 'abc'); 
INSERT INTO `order` VALUES ('12', 'abc'); 
INSERT INTO `order` VALUES ('13', 'xyz'); 

は今を参照してください、どのようにCustomerテーブルは次のようになりん:

SELECT 
* 
FROM Customer; 

出力:

CID name oid 
1 abc 10 
2 abc 11 
3 abc 12 
4 xyz 13 
+0

ありがとう、私は今これを試してみます。 – Ravikumar

+0

ちょうど私が今投稿した所与のデータを照会してください。 @Ravikumar – 1000111

+1

ありがとう、それは働いた。いい説明 – Ravikumar

1

これは非常に複雑です。 updateステートメントで少し痛いカウンタ値を各値に割り当てる必要があります。しかし、このようなものは動作するはずです:

update customer c join 
     (select c.*, 
       (@rn := if(@n = name, @rn + 1, 
          if(@n := name, 1, 1) 
         ) 
       ) as rn 
     from customer c cross join 
      (select @n := '', @rn := 0) params 
     order by name, cid 
     ) cc 
     on c.cid = cc.cid join 
     (select o.*, 
       (@rno := if(@no = name, @rno + 1, 
          if(@no := name, 1, 1) 
         ) 
       ) as rn 
     from orders o cross join 
      (select @no := ', @rno := 0) params 
     ) o 
     on c.name = o.name and c.rn = o.rn 
    set c.oid = o.oid; 
+0

はありがとう、私はこれを試してみますが、あなたは何をこのクエリを説明簡潔にしてくださいすることができますやってる?複雑に見える – Ravikumar

+0

@Ravikumar。 。 。各テーブルの 'name'値を列挙しているので、列挙された値(" counter ")は結合に使用できます。 –

+0

ありがとうございましたが、回答は1つしか選択できませんので、upvoteを指定してください。 – Ravikumar

関連する問題