2012-07-24 42 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 

Vì vậy, về cơ bản tôi muốn chọn nơi các điều kiện của (id1, id2) = (giá trị1, giá trị2). Tương tự như tuyên bố bên dưới:Cập nhật SQL trong bộ dữ liệu

WHERE id1 = value1 AND id2 = value2 

tuy nhiên trong tập hợp các giá trị trong một mảng. Điều này có khả thi không?

Cảm ơn trước

EDIT: Tôi đang sử dụng máy chủ SQL 2008. Tôi xin lỗi nếu nó không quá rõ ràng. Tôi đang cố gắng đặt điều này như một thủ tục được lưu trữ và gọi nó từ một dịch vụ. Dữ liệu đầu vào sẽ là một số loại mảng (kích thước biến), và tìm một kết quả phù hợp với hai ID trong một hàng.

+3

Bạn đang sử dụng cơ sở dữ liệu nào? –

Trả lời

2

Dưới đây là cách để làm điều đó trong MSSQL. Tất cả những gì bạn cần là tạo một giá trị (trong ví dụ này VARCHAR) từ Id1 và Id2. Trong trường hợp này, bạn có thể sử dụng lệnh IN với các giá trị được đặt. Ngoài ra, bạn nên suy nghĩ về NULL trong id1 và id2 nếu chúng được cho phép trong các trường này (chỉ cần thêm: 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

Cảm ơn bạn rất nhiều. Đây chính là nó. Nhưng so sánh varchar là không thực sự tốt, hiệu suất khôn ngoan, phải không? –

+0

Thực ra bạn có thể thực hiện bất kỳ giá trị tìm kiếm kiểu nào. Ví dụ nếu nói id1, id2 luôn <1000 trong bảng của bạn, bạn có thể thay thế câu lệnh WHERE này thành: WHERE id1 * 1000 + id2 trong (1001,2001). Trong trường hợp này bạn thậm chí không chuyển đổi thành chuỗi. – valex

0

nếu bạn đang sử dụng SQL Server thử này

 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)); 

thử này nếu bạn đang sử dụng oracle

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

thường chúng tôi sử dụng tại khoản nếu chúng ta có thêm rằng một giá trị cho phù hợp. giả sử bạn (id1 = value1 và id2 = value2) và (id1 = value3 và id2 = VALUE4)

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

Cảm ơn bạn đã trả lời. Tôi đã thử điều này trên máy chủ SQL, và nó thực hiện tốt. Tuy nhiên kết quả không phải là những gì tôi đang tìm kiếm. Nó cho kết quả buồn cười, rằng tôi không chắc những gì tuyên bố điều kiện. Bạn có muốn giải thích, có thể áp dụng cho những thứ khác. Cảm ơn bạn –

+0

mã của tôi là phù hợp hơn với oracle vì tôi sử dụng oracle, tôi sẽ chỉnh sửa câu trả lời của tôi để giải thích nó một lần nữa bằng cách sử dụng máy chủ SQL – user1512999

0

Một ý tưởng để đạt được điều này là sử dụng bảng 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

Hãy thử này - Phiên bản 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

truy vấn này hoạt động trong oracle ...

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

Đó là cơ sở dữ liệu của bạn?

+0

Tôi xin lỗi tôi đã không đặt chi tiết đó. Tôi đang sử dụng SQL server 2008 –

+0

Đó là kiểu dữ liệu đầu vào cho điều kiện ở đâu? Tôi đoán Array không có mặt trong SQL server 2008. – TechDo

0

Bạn đang cố gắng làm gì cơ bản? Tại sao đây là cách bạn đã chọn để làm điều đó? Dường như bạn có một chút mờ trong việc hiểu logic dựa trên bộ. Mỗi câu trả lời được cung cấp bởi các áp phích khác là hợp lệ và sẽ hoạt động, nhưng có thể không phù hợp nhất với mục đích của bạn. Đây có phải là quá trình xử lý đối với tập dữ liệu hiện tại không? Là một phần của quá trình tải hoặc chèn dữ liệu? Mỗi trường ID bạn đã liệt kê có phạm vi giá trị duy nhất của riêng nó. Dựa trên ví dụ của bạn có vẻ như những gì bạn đang thực sự muốn làm là cập nhật giá trị bool khi ID2 = 1

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

Nhiều khả năng bạn đang muốn phát triển một logic đó đặt giá trị Bool dựa trên một số dữ liệu quy tắc - ví dụ: nếu Id2 nhỏ hơn hoặc bằng Id1. Một tuyên bố trường hợp hoạt động ở đây:

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

Điều này hiệu quả hơn khi bạn xử lý các bộ quy tắc AND/OR trong mệnh đề WHERE cho mỗi biến thể của giá trị bạn chèn.

Hãy xem WHERE là bộ lọc chứ không phải là nơi để triển khai nếu/sau đó nhập logic.

Chèn dữ liệu nhỏ (bạn có thể nhập giá trị vào trường bảng theo cách thủ công, chèn vào một số loại giao dịch biểu mẫu web bằng giao dịch) có lẽ đơn giản nhất là đặt giá trị theo cách thủ công, hoặc xây dựng phần thủ tục của hệ thống của bạn và áp dụng quy tắc xác thực cho bảng.

Nếu bạn muốn viết thủ tục đã lưu, bạn sẽ tạo biến cho giá trị ID và liên kết các biến này với bất kỳ hệ thống nào truyền thông tin bên ngoài vào hệ thống cơ sở dữ liệu của bạn. (Tôi sẽ đoán bạn đã tạo ra các cấu trúc bảng);

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 

Quá trình này có thể được gọi bởi chương trình của bạn và bạn chuyển các biến bạn có thể tạo từ một mảng vào đó. Cũng có nhiều cách để bạn có thể nhập các giá trị trực tiếp vào cột thích hợp và sau đó thực hiện logic Bool trong mã chèn sau. "Hard Coding" một câu lệnh WHERE để xử lý mọi trường hợp là không hiệu quả, và một thói quen xấu để xâm nhập vào.

0

Bạn có thể gửi danh sách giá trị của mình đến quy trình được lưu trữ dưới dạng XML. Giải nén biến XML thành bảng và sử dụng exists để tìm các hàng mà bạn nên cập nhật.

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) 

Gọi như thế này:

exec YourSP '<Row> 
       <id1>1</id1> 
       <id2>1</id2> 
      </Row> 
      <Row> 
       <id1>2</id1> 
       <id2>1</id2> 
      </Row>' 
Các vấn đề liên quan