2016-01-13 3 views
2

У меня есть 3 таблицы следующим образомсмесительные 3 SQL запросов в 1

Table1

Id Name 
1 abcd 
2 bcd 
3 dabc 

TABLE2

Id2 Name2 
2 xyz 
3 def 
4 mno 

Table3

Id Id2 Value 
1 4 1 
2 3 1 
3 4 1 

Теперь

Из таблицы 1: Мне нужно выбрать все Идентификатор, где Имя% abc% Из таблицы2: Мне нужно выбрать Id2, где Name2 является «mno» Из таблицы 3: мне нужно изменить значение на 0 из 1, где значение Id от Таблица 1 и Id2 приведены в таблице 2.

Таблица 1:

select Id from Table1 where Name like '%abc%' 

Table2:

select Id2 from Table2 where Name2 = "mno" 

Таблица 3:

update Table3 set Value = 0 where Id in() and Id2= 

Но, я не знаю, как сделать это 1 один запрос. Кто-нибудь, пожалуйста, проведет меня?

+0

Вы должны заглянуть в вопрос о присоединении «http://dev.mysql.com/doc/refman/5.7/en/join.html» – ncdreamy

+0

Приятная визуальная помощь на присоединениях здесь: http://blog.codinghorror.com/a -visual-explain-of-sql-joins/ – xQbert

ответ

2

См: prior stack article

Вы не объяснили, как T1 относится к T2, поэтому я предположил, что перекрестное соединение.

Всякий раз, когда у вас есть запись в T1 с именем «% abc%» (1,3) в ваших данных .. и всякий раз, когда у вас есть запись в T2 с именем, равным «mno» 4, тогда вы хотите значение в таблице 3, чтобы быть 0

поэтому выбор мы генерируем должны производить 1,4 3,4

и когда мы внутреннее соединение это обратно к таблице 3 она выбирает только

Id Id2 Value 
1 4 1 
3 4 1 

Теперь мы создаем обновление, основанное на на этот выбор, как указано в ссылке, указанной выше ...

UPDATE table3 
INNER JOIN (
    SSELECT t1.ID t1ID, t2.id t2ID 
    FROM table1 t1 
    CROSS JOIN table2 
    WHERE t1.name like '%abc%' 
    and t2.name like = 'mno') B 
on B.t1ID = t3.Id 
and B.t2ID = T3.ID2 
SET value = 0 

дает нам результат

Id Id2 Value 
1 4 0 
2 3 1 
3 4 0 

if we select * from table3 
0
update t3 
set t3.Value = 0 
from Table3 t3 
inner join Table1 t1 
    on t3.Id = t1.Id 
inner join Table2 t2 
    on t3.Id2 = t2.Id2 
where t1.Name like '%abc%' and t2.Name2 = 'mno' 

ИЛИ

update Table3 
set value = 0 
where Id in (select Id from Table1 where Name like '%abc%') 
and Id2 in (select Id2 from Table2 where Name2 = 'mno') 
+0

Обратите внимание: старайтесь избегать использования подзапросов IN и используйте вместо этого EXISTS. Ссылка: http: // explainextended.com/2010/05/27/left-join-is-null-vs-not-in-vs-not-exist-nullable-columns/ Спасибо –

+0

не очень. читайте о оптимизации подзапроса оптимизатором http://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html – joordan831

0

Вы должны думать о UPDATE .. . ГДЕ СУЩЕСТВУЕТ:

update Table3 set Value = 0 
WHERE EXISTS (SELECT 1 FROM Table1 where Name LIKE '%abc%' AND Table1.Id=Table3.Id) 
AND EXISTS (SELECT 1 FROM Table2 where Name2 = "mno" AND Table2.Id2=Table3.Id2) 
Смежные вопросы