Başka bir tablodan ayıklanmış tablo kayıtlarına ekleme


177

Ben bir tablodan veri dönüştürür ve daha sonra başka bir tabloya bu verileri eklemek bir sorgu yazmaya çalışıyorum. Evet, bu bir veri ambarı sorgusu ve MS Access'te yapıyorum. Yani temelde böyle bir sorgu istiyorum:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
  (SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);

Denedim ama bir sözdizimi hata mesajı alıyorum.

Bunu yapmak istersen ne yapardın?

Yanıtlar:


283

"DEĞER" yok, parantez yok:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;

11
aslında hayır ise. sütunları ve türleri aynıdır ve bu tablolarda aynı sırayla çıkar, o zaman şöyle diyebilirsiniz: Tablo2 SEÇİN Tablo2 SEÇİN * Tablo1'DEN;
sactiw

28

İki sözdizimi seçeneğiniz vardır:

seçenek 1

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

CREATE TABLE Table2 (
    id int identity(1, 1) not null,
    LongIntColumn2 int,
    CurrencyColumn2 money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)

INSERT INTO Table2
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1

seçenek 2

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)


SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1
INTO Table2
FROM Table1
GROUP BY LongIntColumn1

Seçenek 2'nin yalnızca projeksiyondaki sütunları (SELECT'tekiler) içeren bir tablo oluşturacağını unutmayın.


24

Hem DEĞERLERİ hem de parantezleri kaldırın.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1


10

Bu örnekte sorununuzun "değerler" anahtar kelimesi olduğuna inanıyorum. Yalnızca bir veri satırı eklerken "değerler" anahtar kelimesini kullanırsınız. Bir seçimin sonuçlarını eklemek için buna ihtiyacınız yoktur.

Ayrıca, select deyimi etrafında gerçekten parantez gerekmez.

Gönderen msdn :

Çoklu kayıt ekleme sorgusu:

INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression

Tek kayıt ekleme sorgusu:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])

4

Bir grup satır eklerken "değerleri" kaldırın ve fazladan parantezleri kaldırın. Avg (CurrencyColumn) için bir takma ad (örnekte yaptığınız gibi) kullanarak veya hiç takma ad kullanmadan döngüsel başvurudan kaçınabilirsiniz.

Sütun adları her iki tabloda da aynıysa, sorgunuz şöyle olur:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;

Ve bir takma ad olmadan çalışır:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;

2

En iyi yol 2 kayıt kümesi tanımlamak ve 2 tablo arasında bir ara olarak kullanmak olacağını düşünüyorum (olacak?).

  1. Her iki kayıt kümesini de aç
  2. İlk tablodan verileri çıkarın (SELECT blablabla)
  3. 2. kayıt kümesini ilk kayıt kümesinde bulunan verilerle güncelleyin (yeni kayıt ekleyerek veya mevcut kayıtları güncelleyerek
  4. Her iki kayıt kümesini kapat

Bu yöntem özellikle farklı veritabanlarındaki tabloları güncellemeyi planlıyorsanız ilginçtir (yani her kayıt kümesinin kendi bağlantısı olabilir ...)


2

bir tabloyu farklı DATABASE'te başka bir tabloya veri ekleme

insert into DocTypeGroup 
    Select DocGrp_Id,DocGrp_SubId,DocGrp_GroupName,DocGrp_PM,DocGrp_DocType 
    from Opendatasource( 'SQLOLEDB','Data Source=10.132.20.19;UserID=sa;Password=gchaturthi').dbIPFMCI.dbo.DocTypeGroup

1

Mevcut bir tabloya çıkartma eklemek istiyor musunuz?

Önemli değilse, aşağıdaki sorguyu deneyebilirsiniz:

SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1 
GROUP BY LongIntColumn1);

Çıkarılan bilgilerle yeni bir tablo oluşturacak -> T1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.