2012-07-24 14 views
11
+------------------+ 
| id1 | id2 | bool | 
+------------------+ 
| 1 | 1 | F | 
| 1 | 2 | F | 
| 2 | 1 | F | 
+------------------+ 

UPDATE table_name 
SET bool = T 
WHERE (id1, id2) IN ((1,1),(2,1)) --Need work here 

Tak więc zasadniczo chcę wybrać, gdzie warunki (id1, id2) = (wartość1, wartość2). podobne do poniższego zestawienia:Aktualizacja SQL, gdzie w zestawie danych

WHERE id1 = value1 AND id2 = value2 

natomiast w zbiorze wartości w tablicy. Czy to możliwe?

góry dzięki

EDIT: Używam serwera SQL 2008. Przepraszam jeśli to nie było zbyt jasne. Próbuję umieścić to jako procedura przechowywana i wywołanie go z usługi. Dane wejściowe byłyby jakąś tablicą (zmienną wielkością) i znajdowałyby dopasowanie z dwoma identyfikatorami z rzędu.

+3

Jaką bazę danych używasz? –

Odpowiedz

2

Oto sposób zrobić to w MSSQL. Wystarczy jedna wartość (w tym przykładzie VARCHAR) z Id1 i Id2. W takim przypadku możesz użyć instrukcji IN z ustawionymi wartościami. Powinieneś także pomyśleć o wartościach NULL w id1 i id2, jeśli są dozwolone w tych polach (po prostu dodaj: and id1 is not null and id2 is not null).

UPDATE table_name 
SET bool = T 
WHERE convert(varchar(20),id1)+','+convert(varchar(20),id2) in ('1,1','2,1') 
+0

Dziękuję bardzo. To jest dokładnie to. Porównywanie varchar nie jest jednak dobre, jeśli chodzi o wydajność, nieprawdaż? –

+0

W rzeczywistości można utworzyć dowolną wartość wyszukiwania. Na przykład, jeśli id1, id2 zawsze <1000 w twojej tabeli, możesz zamienić tę instrukcję WHERE na: WHERE id1 * 1000 + id2 in (1001,2001). W tym przypadku nie można nawet konwertować na ciągi. – valex

0

jeśli używasz SQL Server spróbować

 UPDATE table_name 
    SET bool = T 
    WHERE (convert(varchar 20, id1) + '-' + convert(varchar 20 , id2)) 
     IN (convert(varchar 20 , value1) + '-' + convert(varchar 20 , value2), 
     convert(varchar 20 , value3) + '-' + convert(varchar 20 , value4)); 

spróbować jeśli używasz wyrocznię

 UPDATE table_name 
    SET bool = T 
     WHERE (id1 || '-' || id2) IN (value1 || '-' || value2) 

zazwyczaj używamy w klauzuli jeśli mamy więcej niż jedną wartość pasujące. zakładając (ID1 = wartosc1 i ID2 = wartość2) i (ID1 = wartość3 i ID2 = value4)

 UPDATE table_name 
    SET bool = T 
    WHERE (id1 || '-' || id2) IN (value1 || '-' || value2, value3 || '-' || value4) 
+0

Dziękuję za odpowiedź. Spróbowałem tego na serwerze SQL i wykonałem go dobrze. Jednak wyniki nie były tym, czego szukam. Dało to śmieszne rezultaty, że nie jestem pewien, co robi oświadczenie o stanie. Czy chcesz wyjaśnić, może dotyczyć innych rzeczy. Dziękuję –

+0

mój kod był bardziej odpowiedni z oracle, ponieważ używam oracle, będę edytować moją odpowiedź, aby wyjaśnić to ponownie przy użyciu serwera SQL – user1512999

0

jeden pomysł do osiągnięcia tego celu jest wykorzystanie tabeli temp

Create Table #Temp 
(
    id1 int, 
    id2 int 
) 
insert into #Temp values(1,1) 
insert into #Temp values(1,2) 
insert into #Temp values(2,1) 
insert into #Temp values(2,2) 

--update data 
UPDATE 
table_name 
SET bool = T 
from table_name T1 
inner join #Temp T2 
on T1.Id1= T2.Id1 
and T1.Id2= T2.Id2 
0

Try This - Wersja SQL Server 2008.

create table mytable 
(
id1 int, 
id2 int, 
bool char(1) 
); 

insert INTO mytable VALUES(1,1,'F'); 
insert INTO mytable VALUES(1,2,'F'); 
insert INTO mytable VALUES(2,1,'F'); 

SELECT * FROM mytable; 

update mytable 
set bool='T' 
WHERE exists (SELECT id1,id2 from mytable tb2 
where mytable.id1 = 1 AND mytable.id2 = 1 
or mytable.id1 = 2 AND mytable.id2 = 1); 

SELECT * from mytable; 
0

Ta kwerenda działa w wyroczni ...

UPDATE table_name 
SET BOOL = T 
WHERE (id1, id2) IN (SELECT 1,1 FROM DUAL UNION SELECT 2,1 FROM DUAL); 

Który jest baza danych?

+0

Przykro mi, że nie włożyłem tych informacji. Używam SQL Server 2008 –

+0

Jaki jest typ danych wejściowych dla warunku where? Przypuszczam, że Array nie jest obecny na serwerze SQL 2008. – TechDo

0

Co zasadniczo próbujesz zrobić? Dlaczego tak właśnie wybrałeś? Wygląda na to, że jesteś trochę rozmyty w zrozumieniu logiki opartej na zestawach. Każda z odpowiedzi dostarczonych przez inne plakaty jest ważna i będzie działać, ale może nie być najodpowiedniejsza dla twojego celu. Czy to przetwarzanie odbywa się w oparciu o istniejący zestaw danych? Czy jest to część procesu ładowania danych lub wstawiania? Każde z wymienionych pól ID ma własny zakres unikalnych wartości. Opierając się na przykład okaże się, że to, co jesteś naprawdę chce zrobić jest zmiana wartości bool gdy ID2 = 1

UPDATE table_name SET Bool = 'T' 
WHERE Id2 = 1 

Bardziej prawdopodobne jest to, chcąc rozwijać logiki, który ustawia wartość Bool w oparciu o jakiś danych rule - na przykład jeśli Id2 jest mniejszy niż lub równy Id1. Oświadczenie przypadek pracuje tutaj:

UPDATE table_name SET Bool = CASE WHEN Id1 > Id2 THEN 'T' ELSE 'F' END 

To jest o wiele bardziej efektywne, gdy masz do czynienia z dużymi zestawami danych niż pisanie i/lub zasady w klauzuli WHERE dla każdego zmienności wartości włożeniu.

Wyobraź sobie GDZIE jako filtr, a nie miejsce do implementacji, jeśli/to wpisz logikę.

W małych wstawkach danych (ręcznie wpisujesz wartości do pól tabeli, wstawiasz z jakiejś formy transakcji internetowej według transakcji) najprawdopodobniej najprościej jest po prostu ręcznie ustawić wartość według własnego uznania lub zbudować ją część proceduralną twojego systemu i zastosuj regułę walidacji do tabeli.

Jeśli chcesz zapisać procedurę zapisaną w bazie, utwórz zmienne dla wartości identyfikatorów i połącz je z dowolnym systemem, który przesyła informacje zewnętrzne do systemu bazy danych. (Zakładam, że już utworzyłeś struktury stołów);

CREATE PROCEDURE table_name_insert 
@Id1 Int NOT NULL, 
@Id2 Int NOT NULL 

-- If you want to execute the logic outside of the DB environment 
-- (perhaps as part of an SSIS package) then you will want to add this 
-- variable and pass it in explicitly. 

, @Bool bit NOT NULL 


AS 

DECLARE @sql nvarchar(4000) 


SET @sql = ' 
INSERT INTO table_name (ID1, ID2, Bool) 
SELECT @Id1, @Id2, [Case Logic or Variable Value for Bool] 
' EXEC sp_executeSQL @sql 

Ten proces może zostać wywołany przez twój program i przekazać do niego zmienne, które możesz wygenerować z tablicy. Istnieją również sposoby, w których można importować wartości bezpośrednio do odpowiedniej kolumny, a następnie wykonać logikę Bool w kodzie po włożeniu. "Twarde kodowanie" stwierdzenie WHERE, aby poradzić sobie z każdym przypadkiem, jest nieefektywne i ma zły nawyk.

0

Możesz wysłać listę wartości do procedury składowanej jako XML. Rozpakuj zmienną XML do tabeli i użyj exists, aby znaleźć wiersze, które powinieneś zaktualizować.

create procedure YourSP 
    @XMLParam xml 
as 

declare @T table(id1 int, id2 int) 

insert into @T(id1, id2) 
select T.N.value('id1[1]', 'int'), 
     T.N.value('id2[1]', 'int') 
from @XMLParam.nodes('/Row') as T(N) 

update table_name 
set bool = 'T' 
where exists (select * 
       from @T as T 
       where T.id1 = table_name.id1 and 
        T.id2 = table_name.id2) 

połączeń tak:

exec YourSP '<Row> 
       <id1>1</id1> 
       <id2>1</id2> 
      </Row> 
      <Row> 
       <id1>2</id1> 
       <id2>1</id2> 
      </Row>'