2015-01-01 3 views
0

У меня есть таблица с именем AccessRight с этими данными выборки:Как вставить в тот же сервер sql таблицы?

ID Accessfor AccessOn 
--------------------------- 
1  40   51 
2  40   52 
3  40   53 
4  43   51 
4  43   54 
5  43   55 

Я хочу, чтобы вставить/удалить записи accessfor = 40 и вставить эту таблицу в качестве accessfor = 43 означает таблица будет иметь записи, как показано ниже

1  43   51 
2  43   52 
3  43   53 
4  43   54 
5  43   55 

Пожалуйста, предложите оптимальный оптимальный подход к решению этого вопроса.

+0

наклоняет вы делаете обновление Accessfor = 40 к Accessfor = 43 –

ответ

1

использование update и delete

Использование CTE для удаления повторяющихся записей после Updation.

update table set Accessfor = 43 where Accessfor = 40 

;with cte as 
(
select row_number() over (partition by Accessfor, AccessOn order by id) rn,* 
from table 
) 
delete from cte where rn>1 
+0

Спасибо you.but делать выше запрос дает ошибку, как below.Please сделать необходимый "AK_UserGroupRelation_GroupIDUserID. Значение повторяющегося ключа (43, 51) –

+0

Кажется, что существует ограничение на таблицу. Сначала удалите ограничение в начале запроса и добавьте ограничение снова после удаления. – Tassadaque

+0

DBA не позволит отказаться от ограничений, пожалуйста, выполните необходимые действия. –

0

вы можете просто использовать запрос на обновление, чтобы решить вашу проблему как

update yourtablename set Accessfor=43 where Accessfor=40 

я надеюсь, что это может помочь вам

+0

Тогда как дублировать записи, например 43 51 и 43 51? Пожалуйста, сообщите priya786 –

1
Insert into AccessRight(ID,AccessFor,AccessOn) 
    (select id,43,AccessOn from AccessRight where accessfor = 40 
    and accessOn not in(select accessOn from AccessRight where accessfor = 43)); 
    Delete from AccessRight where accessfor = 40; 

EDIT: (Попробуйте)

Insert into AccessRight(ID,AccessFor,AccessOn) 
(
select id,0,AccessOn from AccessRight 
where id+''+accessfor+''+accesson not in (
select id+''+accessfor+''+accesson from accessright 
where accessfor = 43 
and accesson in(select accesson from accessright where accessfor = 40) 
) 
); 
delete from accessright where accessfor <> 0; 
update accessright set accessfor = 43; 
+0

привет, @ sandipk-tatva посмотрите на мой отредактированный ответ. Надеюсь, это поможет вам. – RubahMalam

0

Что вы можете сделать, это отличный показатель для AccessOn временной таблицы и укоротить первую таблицу и повторно вставить все различные записи с Accessfor = 43.

Проверь это:

-- Your Main Table 
Create table #temp1 
(
    Accessfor int, 
    AccessOn int 
) 

-- This will be temp table 
Create table #temp2 
(
    Accessfor int, 
    AccessOn int 
) 

-- Insert into Main table. This step was for me to get data in Main table. 
Insert into #temp1 values(40, 51) 
Insert into #temp1 values(40, 52) 
Insert into #temp1 values(40, 53) 
Insert into #temp1 values(43, 51) 
Insert into #temp1 values(43, 54) 
Insert into #temp1 values(43, 55) 

select * from #temp1 

--From here actual operation starts... 
Insert into #temp2 
    Select Distinct '43', AccessOn From #temp1 

Truncate table #temp1 
Insert into #temp1 
    Select * From #temp2 

select * from #temp1 
0

, то вы можете проверить его с запрос

mysql_query("select id from tablename where Accessfor=43 && Accesson='anyvalue'"); 
if(mysql_num_rows()>0) 
{ 
mysql_query("delete from tablename Accessfor=43 && Accesson='anyvalue'"); 
} 
else 
{ 
//you do update 
} 
Смежные вопросы