0

データがテーブルに既に存在するかどうかを確認する必要があるシナリオがあります。ユーザー n アプリケーションが既に存在する場合は、挿入を実行する操作を実行する必要はありません。

CREATE TABLE `table1` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT,
  `GroupName` VARCHAR(100) DEFAULT NULL,
  `UserName` VARCHAR(100) DEFAULT NULL,
  `ApplicationName` VARCHAR(100) DEFAULT NULL,
  `UserDeleted` BIT DEFAULT 0,
  PRIMARY KEY (`ID`)
)

CREATE TABLE `temp_table` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT,
  `GroupName` VARCHAR(100) DEFAULT NULL,
  `UserName` VARCHAR(100) DEFAULT NULL,
  `ApplicationName` VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (`ID`)
)

table1 はメインテーブルで、temp_table は比較を実行する必要があります。

日付スクリプトの例:

INSERT  INTO `table1`(`ID`,`GroupName`,`UserName`,`ApplicationName`,`userdeleted`) 
VALUES 
('MidasSQLUsers','Kevin Nikkhoo','MySql Application',0),
('MidasSQLUsers','adtest','MySql Application',0),
('Salesforce','Kevin Nikkhoo','Salesforce',0),
('Salesforce','devendra talmale','Salesforce',0);

INSERT  INTO `temp_table`(`ID`,`GroupName`,`UserName`,`ApplicationName`,`userdeleted`) 
VALUES 
('MidasSQLUsers','Kevin Nikkhoo','MySql Application',0),
('MidasSQLUsers','adtest','MySql Application',0),
('Salesforce','Kevin Nikkhoo','Salesforce',0),
('Salesforce','Kapil Singh','Salesforce',0);

また、temp_table の行が int table1 に存在しない場合、そのステータスは、目的の出力で述べたように userdeleted 1 になるはずです。

結果: table1

ID  GroupName   UserName    ApplicationName Deleted
1   MidasSQLUsers   Kevin Nikkhoo   MySql Application 0
2   MidasSQLUsers   adtest  MySql   ApplicationName   0
3   Salesforce  Kevin Nikkhoo   Salesforce    0
4   Salesforce  devendra talmale Salesforce   1
5   SalesForce  Kapil Singh Salesforce    0

助けてください

4

2 に答える 2

1

これはトリックを実行し、concat 内にあるものを変更して、仕様を満たす必要があります。

まず、tempTable にない行を「削除」する更新を 1 回実行します。

   update table t1 set deleted = 'YES' 
    where concat( t1.groupName, t1.Username, t1.application) NOT IN 
    (select  concat( t2.groupName, t2.Username, t2.application) from tempTable t2);

2 番目: 新しいレコードを挿入する

insert into table1 t1 (t1.groupName, t1.username, t1.application_name, t1.deleted)

(select t2.groupName, t2.Username, t2.application, t2.deleted from tempTable t2    
where concat(t2.userName, t2.application, t2.groupName, t2.deleted) **not in** 
    (select concat(t3.userName, t3.application, t3.groupName, t3.deleted) 
       from table1 t3)

concat 関数は既存の行から新しい行を作成します...このようにして、1つだけを比較しているかのように複数のフィールドを同時に比較できます...

not in」を使用すると、クエリ内にクエリを作成できます...

于 2013-06-17T11:58:10.623 に答える
1

上記のクエリのわずかなバリエーション。

userName、application、および groupName フィールドにインデックスがある場合は、JOIN を使用する方が高速になる可能性があります。

UPDATE table1 t1 
LEFT OUTER JOIN temp_table t2
ON t1.userName = t2.userName
AND t1.application = t2.application
AND t1.groupName = t2.groupName
SET t1.deleted = CASE WHEN t2.ID IS NULL THEN 1 ELSE 0 END  

通常のインサートの場合

INSERT INTO table1 t1 (t1.groupName, t1.username, t1.application_name, t1.deleted)
(SELECT t2.groupName, t2.Username, t2.application, t2.deleted 
FROM tempTable t2    
LEFT OUTER JOIN table1 t3
ON t2.userName = t3.userName
AND t2.application = t3.application
AND t2.groupName = t3.groupName
WHERE t3.ID IS NULL)
于 2013-06-17T13:42:38.230 に答える