Sao chép dữ liệu từ cột này sang cột khác (nằm trong một bảng khác)


89

Tôi muốn sao chép dữ liệu từ cột này sang cột khác của bảng khác. Làm thế nào tôi có thể làm điều đó?

Tôi đã thử những cách sau:

Update tblindiantime Set CountryName =(Select contacts.BusinessCountry From contacts) 

nhưng nó đã không hoạt động.

Tôi muốn sao chép cột "BusinessCountry" của bảng liên hệ sang cột "CountryName" của bảng tblindiantime.


1
Để sao chép các cột từ bảng này sang bảng khác, bạn cần một số loại quan hệ giữa các bảng. Hai bảng có một ID chung không?
mdma,

1
Bạn đang sử dụng cơ sở dữ liệu và phiên bản nào?
Mark Byers

Câu trả lời:


89

Trong SQL Server 2008, bạn có thể sử dụng bản cập nhật nhiều bảng như sau:

UPDATE tblindiantime 
SET tblindiantime.CountryName = contacts.BusinessCountry
FROM tblindiantime 
JOIN contacts
ON -- join condition here

Bạn cần một điều kiện tham gia để chỉ định hàng nào nên được cập nhật.

Nếu bảng đích hiện đang trống thì bạn nên sử dụng INSERT thay thế:

INSERT INTO tblindiantime (CountryName)
SELECT BusinessCountry FROM contacts

1
Xin chào, cảm ơn đại diện của bạn nhưng nó đang hiển thị cho tôi lỗi sau Không thể chèn giá trị NULL vào cột 'IndianTime', bảng 'tqms.dbo.tblindiantime'; cột không cho phép null. INSERT không thành công. Các tuyên bố này đã bị chấm dứt.
Amit Patil,

2
@AmitPatil - Tôi biết điều này đã cũ nhưng có thể giúp ích cho những người như bạn. Sử dụng ISNULL (danh bạ.BusinessCountry, '') thay vì chỉ danh bạ.BusinessCountry và nó sẽ giải quyết được vấn đề của bạn. Về cơ bản chúng ta đang thay thế null bằng một chuỗi rỗng.
Ankur-m

1
Vì ví dụ này không hiển thị "điều kiện tham gia" có thể là gì, hãy xem câu trả lời của Michael Pakhantsov và câu trả lời của cedrikdlbcâu trả lời của Parveen cho một câu hỏi tương tự, trong đó hai cột phải được so sánh để chọn đúng hàng .
ToolmakerSteve

152

Đây là truy vấn:

Cùng một bảng:

UPDATE table_name 
SET column1 = column2

Bảng khác nhau:

UPDATE table_name1 
    SET column1 = (
        SELECT column2
        FROM table_name2
        WHERE table_name1.id = table_name2.id
    );

13
Là sai trong ngữ cảnh của câu hỏi, nơi người hỏi cụ thể liên quan đến 2 bảng.
bPratik

2
Nó hoạt động cho mysql trong trường hợp các cột liên quan đến cùng một bảng.
Satish Pandey

11
Tuy nhiên, điều này không giải quyết được vấn đề của tôi, và tôi đã đến đây thông qua tiêu đề câu hỏi có thể phù hợp với câu trả lời này hơn là phù hợp với chi tiết trong câu hỏi!
Rob Grant

6
Câu trả lời này trả lời tiêu đề của câu hỏi, thay vì chính câu hỏi. Tuy nhiên, tôi thấy điều này hữu ích cho những gì tôi đang cố gắng làm.
wizard07KSU

1
đây là một câu trả lời xuất sắc; nó đã giúp tôi chỉ sao chép một cột từ bản sao lưu của tôi vào bảng chính!
Zelter Ady

22

Table2.Column2 => Table1.Column1

Tôi nhận ra câu hỏi này đã cũ nhưng câu trả lời được chấp nhận không phù hợp với tôi. Đối với những người dùng google trong tương lai, đây là những gì phù hợp với tôi:

UPDATE table1 
    SET column1 = (
        SELECT column2
        FROM table2
        WHERE table2.id = table1.id
    );

Theo đó:

  • table1 = bảng có cột cần được cập nhật
  • table2 = bảng có cột với dữ liệu
  • column1 = cột trống cần dữ liệu từ cột2 (đây là trong bảng1)
  • column2 = cột có dữ liệu (trong table2)

1
Làm việc cho tôi - nhưng là giống như câu trả lời ở trên bởi[Michael Pakhantsov]
Don Cheadle

3
Bạn nói đúng, @mmcra, nó bây giờ giống như câu trả lời ở trên. Tuy nhiên, nó không giống như vào thời điểm tôi viết bình luận này. Bạn sẽ nhận thấy rằng nó đã được chỉnh sửa vào tháng 9 và các lỗi đã được sửa. Tôi đã viết bình luận này vào tháng Sáu.
Kenny Grage,

16

Hy vọng bạn có lĩnh vực chính là hai bảng.

 UPDATE tblindiantime t
   SET CountryName = (SELECT c.BusinessCountry 
                     FROM contacts c WHERE c.Key = t.Key 
                     )

1
điều này chỉ hợp lệ nếu bạn thay thế một trường bằng một trường khác, nó sẽ ném ra ORA-01427: single-row subquery returns more than one rownếu lựa chọn trả về nhiều hơn một hàng, điều gì sẽ xảy ra nếu tôi muốn chọn nhiều hơn một hàng và cập nhật cột với các giá trị này?
Muhammad Ramahy

3
@Muhammad Ramahy, Bạn có bảng lồng nhau trong cột cập nhật không? trong truy vấn con trả về một số hàng, thì Key không phải là PrimaryKey cho bảng danh bạ. Nếu bạn có khóa chính tổng hợp, bạn chỉ cần điều kiện cho mệnh đề WHERE.
Michael Pakhantsov

1
Tôi không hiểu bạn muốn nói gì với "Hy vọng bạn có lĩnh vực quan trọng là hai bàn"
Marco Lackovic

2
@Krige - Anh ấy dường như có nghĩa là "Nếu hai bảng có trường Khóa dùng chung để xác định hàng nào của mỗi bảng khớp với hàng của bảng khác" . Nếu bạn không, thì bạn cần phải thay đổi những gì sau đó WHERE. Ví dụ: nếu tblindiantime có trường ContactID, là IDhàng contactsthuộc về mỗi hàng trong tblindiantime, thì bạn sẽ sử dụng WHERE tblindiantime.ContactID=contacts.ID. Xem câu trả lời của cedrikdlb cho một biến thể khác.
ToolmakerSteve

8

Câu trả lời của một câu hỏi tương tự phù hợp với tôi hơn câu trả lời đã chọn của câu hỏi này (của Mark Byers). Sử dụng câu trả lời của Mark, cột được cập nhật của tôi có cùng giá trị trong tất cả các hàng (có lẽ là giá trị từ hàng đầu tiên khớp với phép nối). Sử dụng câu trả lời của ParveenaArora từ chuỗi khác đã cập nhật cột với các giá trị chính xác.

Chuyển đổi giải pháp của Parveena để sử dụng tên bảng và cột của câu hỏi này, truy vấn sẽ như sau (trong đó tôi giả sử các bảng có liên quan với nhau thông qua tblindiantime.contact_id):

UPDATE tblindiantime
SET CountryName = contacts.BusinessCountry
FROM contacts
WHERE tblindiantime.contact_id = contacts.id;

3

Tôi nghĩ rằng tất cả các câu trả lời trước đây đều đúng, mã bên dưới này rất hợp lệ, đặc biệt nếu bạn phải cập nhật nhiều hàng cùng một lúc, lưu ý: đó là PL / SQL

DECLARE
    CURSOR myCursor IS 
      Select contacts.BusinessCountry 
      From contacts c WHERE c.Key = t.Key;
    ---------------------------------------------------------------------
BEGIN
    FOR resultValue IN myCursor LOOP
        Update tblindiantime t
        Set CountryName=resultValue.BusinessCountry 
        where t.key=resultValue.key;
    END LOOP;
END;

Tôi ước điều này có thể giúp đỡ.


2

Giờ đây, việc quản lý studio 2016 trở nên dễ dàng hơn.

Sử dụng SQL Server Management Studio

Để sao chép dữ liệu từ bảng này sang bảng khác

Mở bảng có các cột bạn muốn sao chép và cột bạn muốn sao chép vào bằng cách bấm chuột phải vào các bảng, sau đó bấm Thiết kế .

2. nhấp vào tab cho bảng có các cột bạn muốn sao chép và chọn các cột đó.

3.Từ menu Chỉnh sửa , nhấp vào Sao chép .

Mở cửa sổ Trình soạn thảo truy vấn mới.

5. Bấm chuột phải vào Trình soạn thảo Truy vấn, rồi bấm Truy vấn Thiết kế trong Trình soạn thảo .

6. trong hộp thoại Thêm bảng , chọn bảng nguồn và bảng đích, bấm Thêm , rồi đóng hộp thoại Thêm bảng .

7. Bấm chuột phải vào vùng đang mở của Trình soạn thảo Truy vấn, trỏ chuột vào Loại Thay đổi , sau đó bấm Chèn Kết quả .

8. trong hộp thoại Chọn bảng mục tiêu để chèn kết quả , hãy chọn bảng đích.

9. Trong phần trên của Trình thiết kế truy vấn, hãy bấm vào cột nguồn trong bảng nguồn.

10. Nhà thiết kế truy vấn hiện đã tạo một truy vấn CHÈN. Bấm OK để đặt truy vấn vào cửa sổ Trình soạn thảo truy vấn ban đầu.

11. Thực thi truy vấn để chèn dữ liệu từ bảng nguồn vào bảng đích.

Để biết thêm thông tin https://docs.microsoft.com/en-us/sql/relational-databases/tables/copy-columns-from-one-table-to-aosystem-database-engine


1

Nó có thể được giải quyết bằng cách sử dụng thuộc tính khác nhau.

  • Sử dụng sự kiện nhấp chuột Điều khiển ô.
  • Chọn giá trị cột mà bạn chuyển sang cột bao phấn.
  • gửi giá trị đã chọn đến hộp văn bản khác hoặc cấp bất kỳ thứ gì bạn điền thuận tiện và một nút bổ sung để sửa đổi thuộc tính đã chọn.
  • cập nhật toàn bộ ngăn xếp op cơ sở dữ liệu và thực hiện một thuật toán với truy vấn sql để vượt qua truy vấn này để chuyển nó sang một cột khác.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.