it-swarm-tr.com

Başka bir tablodan çıkarılan tablo kayıtlarına INSERT nasıl yapılır

Tablodan veri ayıklayan ve dönüştüren bir sorgu yazmaya çalışıyorum ve sonra bu verileri başka bir tabloya ekliyorum. Evet, bu bir veri depolama 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?

173
Martin08

"DEĞER" yok, parantez yok:

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

İki sözdizimi seçeneğiniz var:

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ın bulunduğu bir tablo oluşturacağını unutmayın (SELECT'teki olanlar).

26
Jorge Ferreira

Hem DEĞERLERİ hem de parantezi çıkarın.

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

SQL'den VALUES öğesini kaldırın.

10

Bu örnekteki sorunun "değerler" anahtar kelimesi olduğuna inanıyorum. Yalnızca bir satırlık veri eklerken "value" anahtar sözcüğünü kullanırsınız. Bir seçimin sonuçlarını eklemek için buna ihtiyacınız yok.

Ayrıca, select ifadesinin etrafındaki parantezlere gerçekten ihtiyacınız yoktur.

msdn içinden:

Ç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[, …])
10
Sean

Bir grup satır eklerken "değerleri" kaldırın ve fazladan parantezleri kaldırın. Dairesel referansı, avg için bir takma ad kullanarak (CurrencyColumn) (örneğinizde yaptığınız gibi) veya hiçbir takma ad kullanmamaktan kaçınabilirsiniz.

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

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

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

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

farklı DATABASE içindeki bir tablodan diğerine 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

Bence en iyi yöntem 2 kayıt kümesini tanımlamanın ve bunları 2 tablo arasında bir ara madde olarak kullanmanın (olacak?) Olacağını düşünüyorum.

  1. Her iki kayıt kümesini aç
  2. Verileri ilk tablodan al (SELECT blablabla)
  3. 2. kayıt kümesini ilk kayıt kümesinde yer alan verilerle güncelleyin (yeni kayıtlar ekleyerek veya varolan kayıtları güncelleyerek
  4. Her iki kayıt kümesini kapat

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

2

Mevcut bir tabloya çıkarma eklemek ister misiniz?

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

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

Yeni bir tablo yaratacaktır -> T1 çıkarılan bilgilerle birlikte

1
Ashwin