Temat: dziwne działanie INSERT

Witam,

Próbuje przekopiować kolumny z różnych tabel do jednej tabeli.
Robię to za pomocą "select insert into" i niby wszystko działa ale insert działa nie tak jak sobie założyłem.
W pierwszej kolumnie wszystko jest ok, ale druga kolumna zaczyna się od wiersza następnego gdzie kończy się pierwsza itd.
Dla przykładu gdybym kopiował litery po alfabetu to w pierwszej kolumnie byłoby
wiersz 1: a
w2: b
w3: c
w drugiej było by już
w1: null
w2: null
w3: null
w4: d
w5: e
w6: f

Czy da się zrobić tak żeby w każdej kolumnie, insert zaczynał się od pierwszego wiersza?

konto usunięte

Temat: dziwne działanie INSERT


a jesteś pewien że dane które kopiujesz nie zawierają nulli ? Może dodaj warunek dla danych które przesyłasz WHERE kol IS NOT NULL ....

insert into tabela1(pole1)
select * from tabela2 where pole2 is not null

Mateusz H. edytował(a) ten post dnia 23.07.12 o godzinie 12:21

Temat: dziwne działanie INSERT

Niestety efekt taki sam.
To nie mogły być NULLe bo dane w następnej kolumnie zawsze zaczynają się w następnym wierszu gdzie kończy się poprzednia kolumna... robią się takie schodki ;)
Marek Hoć

Marek Hoć Oprogramowanie dla
biznesu i nie tylko;
systemy oparte na...

Temat: dziwne działanie INSERT

Wyślij swojego SELECTa - będzie łatwiej zdiagnozować.

konto usunięte

Temat: dziwne działanie INSERT

Trudno zgadywac bez zapytania, ale sugeruje sprawdzic czy uzywasz pelnej skladni:

INSERT INTO tabela1(pole1, pole2, pole3) SELECT pole1, pole2, pole3 FROM tabela2

zamiast:
INSERT INTO tabela1(pole1, pole2, pole3) SELECT * FROM tabela2

Kilka literek wiecej a masz kontrole nad tym co sie dzieje...

Temat: dziwne działanie INSERT

Polecenia wyglądają tak:

Insert Into wymiary (A) Select A From serwer2.baza2.wymiarA

Insert Into wymiary (B) Select B From serwer2.baza2.wymiarB

Insert Into wymiary (C) Select C From serwer2.baza2.wymiarC

Jak widać tabela na moim serwerze ma za zadanie zebrać wymiary z różnych baz na innym serwerze. Dane wszędzie są kompletne i nie występują żadne NULLe. Jakub M. edytował(a) ten post dnia 24.07.12 o godzinie 11:29

konto usunięte

Temat: dziwne działanie INSERT

Mateusz H. edytował(a) ten post dnia 24.07.12 o godzinie 11:59

Temat: dziwne działanie INSERT

no tak ale jak robisz tak jak napisales

Insert Into wymiary (A) Select A From serwer2.baza2.wymiarA

Insert Into wymiary (B) Select B From serwer2.baza2.wymiarB

Insert Into wymiary (C) Select C From serwer2.baza2.wymiarC

to twoja intencja jest zeby to wszystko tworzylo jeden rekord tak?
tzn
tabela wymiary ma postac

A | B | C -header

i chcesz zeby tak to bylo wypelniane tzn A leci do A B leci do B itd?

a robiac to w taki sposob jak opisales to wstawiasz takie wiersze

A | B | C -header

A |NULL|NULL
NULL|B|NULL
NULL|NULL|CMichał Patrzałek edytował(a) ten post dnia 24.07.12 o godzinie 11:38

Temat: dziwne działanie INSERT

No racja :) Jak chwilę o tym pomyśleć to to nawet logiczne ;)
W takim razie jak zrobić operację żeby dane w każdej kolumnie zaczynały się "od góry" ?

Temat: dziwne działanie INSERT

Mógłbyś wyjaśnić na jakimś przykładzie co to znaczy od góry?

To jest tak jak napisałem że

A idzie do A, B idzie do B itd i to wszystko w jednym wierszu tak o to Ci chodzi?

konto usunięte

Temat: dziwne działanie INSERT

Jakub M.:
No racja :) Jak chwilę o tym pomyśleć to to nawet logiczne ;)
W takim razie jak zrobić operację żeby dane w każdej kolumnie zaczynały się "od góry" ?


a mozesz jakos joinowac te tabele, po jakims id ?

głupie, ale może kursorem ;) tyle ze przydalby sie jakis id wiersza...

insert Into wymiary (A) Select A From serwer2.baza2.wymiarA

declare @id int
declare @var varchar(100)
declare cr cursor for
Select ROW_NUMBER() OVER (ORDER BY b) as id , b From serwer2.baza2.wymiarB

open cr
fetch next from cr into @id, @var
while @@FETCH_STATUS = 0
begin
update wymiary
set
b = @var
where id = @id

fetch next from cr into @id, @var
end
close cr
deallocate cr
Mateusz H. edytował(a) ten post dnia 24.07.12 o godzinie 14:29

Temat: dziwne działanie INSERT

Troche to zagmatwane robić kursorem. Przedewszystkim to jest integracja danych tak?
Powinieneś zadać sobie pytania jak chcesz te dane połączyć bo nie wydaje mi się żebyś chciał robić np Cross Joina?

Czy są tak jak kolega wspomniał jakieś id (aczkolwiek jeśli to różne serwery to nie sądzę żeby id w jakikolwiek sposób sobie odpowiadały bo są generowane poprzez zmienna systemową identity jak dobrze pamiętam).
W takim razie jest może jakiś natural key po którym chcesz identyfikować te wiersze.
Zazwyczaj te id w każdej tabelce są generowane niezależnie?
Najlepiej to wygenerować dynamicznym SQL updaty z wartością i odpowiednim id/natural key.
Zresztą powinieneś mieć jakieś info jak je joinować tak?
Wtedy robisz
insert into ... select join wszystkich wymiarów
problem z głowy?Michał Patrzałek edytował(a) ten post dnia 24.07.12 o godzinie 14:42

konto usunięte

Temat: dziwne działanie INSERT


jak nie kursor, to może tabele tymczasowe. będzie git, jeśli w tych 3 tabelach , bedzie tyle samo rekordow


IF OBJECT_ID('tempdb.. #a') IS NOT NULL
drop table #a
create table #a(
id int IDENTITY(1,1),
a varchar(30)
)

IF OBJECT_ID('tempdb.. #b') IS NOT NULL
drop table #b
create table #b(
id int IDENTITY(1,1),
b varchar(30)
)

IF OBJECT_ID('tempdb.. #c') IS NOT NULL
drop table #c
create table #c(
id int IDENTITY(1,1),
c varchar(30)
)

insert into #a(a) select a from wymiarA
insert into #b(b) select b from wymiarB
insert into #c(c) select c from wymiarC

insert into wymiary(a,b,c)
select

a,b,c
from
wymiarA WA
join wymiarB WB ON WA.ID = WB.ID
join wymiarC WC WC.ID = WB.ID





Mateusz H. edytował(a) ten post dnia 24.07.12 o godzinie 14:54

konto usunięte

Temat: dziwne działanie INSERT

Mateusz H.:

a jesteś pewien że dane które kopiujesz nie zawierają nulli ? Może dodaj warunek dla danych które przesyłasz WHERE kol IS NOT NULL ....

insert into tabela1(pole1)
select * from tabela2 where pole2 is not null


insert into tabela (pole1,...,poleN)
select pole1,...,poleN from (tabela lub tabele)

to chyba najlepszy sposób, zawsze go używam,

w pierwszej kolejności tworze selecta który zwraca porządane kolumny i oczekiwane wartości
potem dodaje na początku insert i gotowe
warto ewentualnie zwrócić uwagę na typy pola i w selectie odpowiednio rzutować (pole_wartosc::int)

Temat: dziwne działanie INSERT

Dzięki wszystkim :)
Zrobiłem sposobem Sebastiana i wszystko śmiga.
Dane z kolumn nie mają nic wspólnego z sąsiednimi kolumnami... są tylko po to żeby ich używać w innym miejscu.
Co do kursorów to mój serwer chyba ich nie lubi bo już przy deklaracji wywala błąd ;) No ale można się bez tego obejść.
Jeszcze raz dzięki wszystkim za pomoc.

Następna dyskusja:

bootstrap - collapse dziwne...




Wyślij zaproszenie do