2016-12-21 3 views
0

У меня есть 2 таблицы первого является продуктом страниц посетилиКаков наилучший способ обновить одну таблицу от другой в SQL?

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| idproduct | varchar(128) | YES |  | NULL |    | 
| logdate | date   | YES |  | NULL |    | 
| idmagasin | int(20)  | YES |  | NULL |    | 
| idenseigne | int(20)  | YES |  | NULL |    | 
| commanded | int(2)  | YES |  | 0  |    | 
+------------+--------------+------+-----+---------+----------------+ 

И второй один продукт заповедал

+-------------+--------------+------+-----+-------------------+----------------+ 
| Field  | Type   | Null | Key | Default   | Extra   | 
+-------------+--------------+------+-----+-------------------+----------------+ 
| id   | int(11)  | NO | PRI | NULL    | auto_increment | 
| idproduct | varchar(255) | NO |  | NULL    |    | 
| idenseigne | int(11)  | NO |  | NULL    |    | 
| idmagasin | int(11)  | NO |  | NULL    |    | 
| ingredients | tinytext  | YES |  | NULL    |    | 
| date  | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
+-------------+--------------+------+-----+-------------------+----------------+ 

Как я обновить столбец заповедал in product_visited, if product_visited.idproduct = product_commanded.idproduct and product_visited.logdate = product_commanded.date

Я смущен, чтобы использовать внутреннего соединение или существует

Я хочу update product_visited.commanded = 1, когда значение logdate и idproduct существует в product_commanded, это будет означать, что продукт посетил командует слишком

+0

Вы хотите присоединиться к таблицам, используя существует не позволит использовать любое из полей из подзапроса, чтобы обновить основную таблицу. –

+0

Вы помещаете условия предиката, которые вы указываете, в предложение where в своем заявлении об обновлении. Но чтобы получить полный SQL, вы должны сказать нам, какое значение (или выражение, которое можно оценить), к которому вы хотите обновить столбец 'commanded'. –

+0

@RichBenner я читал документ для «join», но когда мы присоединяемся, можем ли мы обновить таблицу в одно и то же время? – parik

ответ

2

Я считаю, что это то, что вы ищете:

Update product_visited pv 
    set commanded = 1 
    Where exists (Select 1 
        from product_commanded pc 
        where pv.idproduct = pc.idproduct and pv.logdate = pc.date 
       ); 
+0

Я не могу голосовать сейчас, спасибо большое, это именно то, что я искал – parik

1

Хорошо, я сделал предположение с поля объединения, но вы после чего-то вроде этого;

UPDATE pv 
SET pv.Commanded = 1 
FROM Product_Visited pv 
JOIN Product_Commanded pc 
    ON pv.logdate = pc.date 
    AND pv.idproduct = pc.id 

Внутреннее соединение означает, что вы только собираетесь обновлять записи в Product_Visited, где Есть соответствующие строки в Product_Commanded на основе предикаты вы даете ему.

Примечание: это ответ SQL Server. Может или может не работать в MySQL

1

Похоже, вы хотите обновить commanded всякий раз, когда существует запись для одного и того же продукта в таблице commanded?

в любой базе данных:

Update product_visited set commanded = 1 
Where exists(Select * from product_commanded 
      where product_id = product_visited.Product_id) 
+1

Это стандартный SQL и должен работать в любой базе данных. –

+0

@ Gordon, да, я начал с другого кода, который бы не был таким же в mySQL –

+0

, он тоже работает, спасибо – parik

Смежные вопросы