2014-09-24 70 views
1

我的问题是使用其他表中的数据更新一个表中的数据。我的SELECT查询获取所有需要的行,但UPDATE查询不影响任何内容。哪里不对? 这里是SELECT查询:UPDATE不影响某些行

SELECT 
t1.id, 
COUNT(*) 
FROM table_1 as t1 
LEFT JOIN table_2 as t2 
    ON t1.system_id = t2.system_id 
    AND t1.tenant_id = t2.tenant_id 
    AND name LIKE '%<ohne>' 
    AND t2.created_by_id = '1' 
    WHERE t1.system_project_id IS NULL  

这里是UDATE查询

UPDATE table_1 as t1 
LEFT JOIN table_2 as t2 
ON t1.system_id = t2.system_id 
    AND t1.tenant_id = t2.tenant_id 
    AND name LIKE '%<ohne>' 
    AND t2.created_by_id = '1' 
    SET t1.system_project_id = t2.id 
    WHERE t1.system_project_id IS NULL 

表stucture:

的样本数据
CREATE TABLE table_1 (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `tenant_id` int(11) DEFAULT NULL, 
    `system_id` int(11) NOT NULL,  
    `system_project_id` int(11) DEFAULT NULL, 
) 

CREATE TABLE `table_2` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_by_id` int(11) NOT NULL, 
    `system_id` int(11) NOT NULL, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `tenant_id` int(11) DEFAULT NULL, 
) 

更新后
table_1: 
id: 1 
tenant_id:1 
system_id:1 
system_project_id:NULL 

table2: 
id:1 
tenant_id:1 
system_id:1 
name:blabla<ohne> 
created_by_id:1 

预期的数据:

table_1: 
    id: 1 
    tenant_id:1 
    system_id:1 
    system_project_id:1 

我稍微更新我的查询,所以现在的样子:

IF EXISTS (
SELECT t2.id FROM table_1 as t1 
LEFT JOIN table_2 as t2 ON t1.system_id = t2.system_id 
AND t1.tenant_id = t2.tenant_id AND name LIKE '%<ohne>' AND syp.created_by_id = '1' 
WHERE t1.system_project_id IS NULL 
) 
THEN 
    UPDATE table_1 as t1_1 
    SET t1.system_project_id = t2.id 
    FROM table_2 as syp WHERE t1_1.system_id = t2.system_id 
    AND t1_1.tenant_id = t2.tenant_id AND name LIKE '%<ohne>' AND t2.created_by_id = '1' 
    AND t1_1.system_project_id IS NULL; 
ELSE 
    INSERT INTO table_2 (created_by_id, updated_by_id, system_id, created_at, updated_at,    name, tenant_id) 
    SELECT 1,1, t1_1.system_id, NOW(), NOW(), CONCAT(t3.name,'<ohne>'), t1_1.tenant_id 
    FROM table_1 as t1_1 
    LEFT JOIN table_3 as t3 ON rem.system_id = t3.id 
    WHERE t1_1.system_project_id IS NULL; 
END IF; 

DUT它仍然无法正常工作。 table_3只是一个获取'name'的连接表。

+5

据推测,'t2.id'总是'NULL'当't1.system_project_id IS NULL'。 – 2014-09-24 14:31:51

+1

选择t1.id但在更新中设置t2.id?你可以选择t2.id,查看计数 – 2014-09-24 14:39:29

+0

是的,选择t2.id与SELECT查询返回NULL - 所以,这是一个任务,完成缺少system_project_id的所有t1行。 – Kamil 2014-09-24 14:46:39

回答

1

试试这个select语句。

SELECT t2.id, t1.id, t1.system_project_id FROM table2 AS t2, table_1 AS t1 
LEFT JOIN table_2 as t2 ON t2.id = t1.system_project_id 
WHERE t1.tenant_id = t2.tenant_id 
AND t1.system_id = t2.system_id 
AND name LIKE '%<ohne>' AND t2.created_by_id = '1' 
AND t1.system_project_id IS NULL`enter code here` 

table_2上的左连接可以在结果表中创建t1.id空值。这些是table_2中对应的table_1行缺失的行。

您不应该使用“AND name LIKE'%'”作为ON子句。

其中t1.id IS NOT NULL,更新 凡t1.id IS NULL,插入

相关问题