2016-06-09 4 views
0

я в состоянии сделать обновление между таблицами на основе подсчета во второй таблице, как так:Обновление с помощью соединения и группы со счетом

Update TableJ J 
Inner Join (Select B_ID,C,S from TableC group by C,S having count=1) C 
On J.C=C.C and J.S=C.S 
Set T1.B_ID=T2.B_ID 

проблема заключается в моем TableC не содержит S, который хранится в другой таблице и связанный через B назовите его Table_BS (без шуток пожалуйста: |). Если бы я не придется беспокоиться о подсчете поэтому я мог бы сделать:

Update TableJ J 
Inner Join TableC C 
Inner Join TableBS BS 
On J.C=C.C and C.S=BS.S 
Set J.B_ID=BS.B_ID 

За исключением вопроса есть, как с первоначальным подсчетам, я только хочу, чтобы вернуться B_ID, когда есть только один C запись с S записи в TableBS.

Update: Ну это, как далеко я получил (выбрать мудры):

Select J.ID,B.B_ID 
From DBJ J Inner Join LBS B Inner Join C 
On J.C=C.C And (
J.S_ID = B.S_ID 
or J.S_ID=B.CS_ID) 
and B.B_ID=C.B_ID 

Что в моем случае возвращает три записи:

+----+------+ 
| ID | B_ID | 
+----+------+ 
| 88 | 100 | 
+----+------+ 
| 90 | 200 | 
+----+------+ 
| 90 | 200 | 
+----+------+ 

ID является запись, которую я хочу update, B_ID - это значение, которое я хочу обновить. В этом случае получается, что число, которое я пытаюсь ограничить, - это столбец идентификатора на выходе, другими словами, я хочу только обновить TableJ, запись 88 со значением 100. Запись TableJ 90 получается> 1 результат, поэтому я хотите пропустить его. Просто не уверен, где поставить group by или count здесь.

Обновление: Не знаю, почему это решение остается за пределами моего понимания, хотя и приближаясь, я могу получить выбор, чтобы вернуть идентификатор записи для обновления и значение для обновления только с этими записями с одним результатом :

Select J.ID,B.B_ID 
From DBJ J Inner Join LBS B Inner Join C 
On J.C=C.C And (
J.S_ID = B.S_ID 
or J.S_ID=B.CS_ID) 
and B.B_ID=C.B_ID group by J.ID having count(*)=1 

который возвращает

+----+------+ 
| ID | B_ID | 
+----+------+ 
| 88 | 100 | 
+----+------+ 

и до сих пор не в состоянии теперь получить, что для обновления TableJ записи 88 поле B_ID со значением 100.

ответ

0

Это, кажется, сделал трюк до сих пор:

Update TableJ T1 
Inner Join 
(Select J.ID,B.B_ID 
From TableJ J Inner Join TableBS B Inner Join TableC C 
On J.C=C.C 
And J.S = B.S 
And B.B_ID=C.B_ID 
group by J.ID having count(*)=1) T2 
On T1.ID=T2.ID Set T1.B_ID=T2.B_ID 

В основном решен сначала с отборным, возвращаемыми идентификатор таблицы обновленияJ и идентификатор B_ID из TableBS, где C в таблице C соответствует C в TableJ, а S в TableBS соответствует S в TableJ. Я подсчитал результаты на основе ID в TableJ, так что я только вернул значения, когда получил один результат.

0

Я не уверен, если я правильно понял проблему, но вот мое решение

Update TableJ J 
Inner Join (
Select B_ID,TableC.C, TableBS.S 
from TableC Inner Join TableBS 
on TableC.B= TableBS.B 
group by TableC.C,TableBS.S 
having count(*)=1 
) C 
On J.C=C.C 
Set J.B_ID=C.B_ID 
+0

Спасибо, но это обновление посторонних записей. Основная идея заключается в том, что в TableC может быть несколько записей с записями в TableBS, но только с номером S. Я обновил свой ответ, когда я закрою его выше. – user3649739

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