ssms jak połączyć dane z różnych źródeł

0

Taki problem mi się trafił i nie potrafię sobie z tym poradzić, razem z zapytaniem jak poniżej, chcę ściągnąć kolumnę z bazy lokalnej, czyli SQL Server. Poniższe zapytanie odpytuje oraclową bazę przez liked server, ale chcę dodać kolumnę, którą jest na SQL Server Express, baza nazywa się "prognoza" tabela "dane_podstawowe" kolumna "waga" wartość, po której można to połączyć to "TABELA1.A_INDEX". Jak mam to dopisać do poniższego zapytania.

IF OBJECT_ID('[dbo].[indeksy_20]') IS NOT NULL

DROP TABLE indeksy_20

SELECT 
A_CLIE,
A_INDEX,
A_NAZWA,
A_BRAND,
A_STATUT,
INDEX.EI_C_EAN,
DEST.CC_C_OPIEK,
A_C_DEST,
A_DATE_SUP,
A_ABC_MIN_DVL AS PRZYJ,
A_ABC_BEZPIECZ AS SKLEP,
BAZY,
PAKOWANIE,
WARSTWA,
ILE_WARSTW,
PALETA

INTO indeksy_20

FROM OPENQUERY(REPLIKA_EU, 'SELECT 
TABELA1.A_CLIE, 
TABELA1.A_INDEX, 
TABELA1.A_NAZWA, 
TABELA1.A_BRAND, 
TABELA1.A_STATUT, 
TABELA2.INDEX.EI_C_EAN, 
TABELA3.DEST.CC_C_OPIEK, 
TABELA1.A_C_DEST, 
TABELA1.A_DATE_SUP, 
TABELA1.A_ABC_MIN_DVL AS PRZYJ, 
TABELA1.A_ABC_BEZPIECZ AS SKLEP,
TABELA1.A_ABC_MIN_DVL-TABELA1.A_ABC_BEZPIECZ*1 AS BAZY,
TABELA1.A_CDT_XYZ_A AS PAKOWANIE,
TABELA1.A_CDT_XYZ_B AS WARSTWA,
TABELA1.A_CDT_XYZ_C AS ILE_WARSTW,
TABELA1.A_CDT_XYZ_B*TABELA1.A_CDT_XYZ_C*1 AS PALETA,
TABELA2.INDEX.EI_ORDRE

FROM TABELA2_INDEX INNER JOIN (TABELA3.DEST INNER JOIN TABELA1 ON (TABELA3.DEST.CC_C_DEST = TABELA1.A_C_DEST) AND (TABELA3.DEST.CC_CLIE = TABELA1.A_CLIE)) ON TABELA2.INDEX.EI_INDEX = TABELA1.A_INDEX')

WHERE A_DATE_SUP > '2017-01-01 00:00:00.0000000' AND EI_ORDRE = 1
1

Piszesz nie jasno. Chcesz sobie wyświetlić dane .. czy chcesz dodać fizycznie tą kolumnę z bazy lokalnej do tworzonej w powyższym kodzie tabeli ?
Jeśli chcesz wyświetlić tylko te dane to tak:

SELECT i.*, dp.Waga
FROM dbo.[indeksy_20] i
JOIN [prognoza].[dbo].[dane_podstawowe] dp -- UWAGA! Zakładam że tabela jest w schema dbo
ON i.[A_INDEX] = dp.[A_INDEX] -- UWAGA! Nie wiem jak ta kolumna z indeksem nazywa się w tabeli dane_podstawowe jeśli kolumna nazywa się inaczej popraw na prawidłową
0

BlackBad już śpieszę wyjaśnić, chcę dodać fizycznie tą kolumnę z bazy lokalnej do tabeli, którą tworzę za pomocą tego kodu.

0

Ok to zmodyfikuj pierwotny kod użyłem CTE żeby było trochę przejrzyściej i filtrowanie w WHERE wstawiłem po stronie serwera źródłowego żeby było optymalniej:

IF OBJECT_ID('[dbo].[indeksy_20]') IS NOT NULL

DROP TABLE indeksy_20

WITH daneOracle as
(SELECT * 
FROM OPENQUERY(REPLIKA_EU, 'SELECT 
TABELA1.A_CLIE, 
TABELA1.A_INDEX, 
TABELA1.A_NAZWA, 
TABELA1.A_BRAND, 
TABELA1.A_STATUT, 
TABELA2_INDEX.EI_C_EAN, 
TABELA3_DEST.CC_C_OPIEK, 
TABELA1.A_C_DEST, 
TABELA1.A_DATE_SUP, 
TABELA1.A_ABC_MIN_DVL AS PRZYJ, 
TABELA1.A_ABC_BEZPIECZ AS SKLEP,
TABELA1.A_ABC_MIN_DVL-TABELA1.A_ABC_BEZPIECZ*1 AS BAZY,
TABELA1.A_CDT_XYZ_A AS PAKOWANIE,
TABELA1.A_CDT_XYZ_B AS WARSTWA,
TABELA1.A_CDT_XYZ_C AS ILE_WARSTW,
TABELA1.A_CDT_XYZ_B*TABELA1.A_CDT_XYZ_C*1 AS PALETA,
TABELA2_INDEX.EI_ORDRE

FROM TABELA2_INDEX INNER JOIN (TABELA3_DEST INNER JOIN TABELA1 ON (TABELA3_DEST.CC_C_DEST = TABELA1.A_C_DEST) AND (TABELA3_DEST.CC_CLIE = TABELA1.A_CLIE)) ON TABELA2_INDEX.EI_INDEX = TABELA1.A_INDEX
WHERE A_DATE_SUP > '2017-01-01 00:00:00.0000000' AND EI_ORDRE = 1')
)

SELECT 
A_CLIE,
A_INDEX,
A_NAZWA,
A_BRAND,
A_STATUT,
INDEX.EI_C_EAN,
DEST.CC_C_OPIEK,
A_C_DEST,
A_DATE_SUP,
A_ABC_MIN_DVL AS PRZYJ,
A_ABC_BEZPIECZ AS SKLEP,
BAZY,
PAKOWANIE,
WARSTWA,
ILE_WARSTW,
PALETA,
dp.Waga

INTO indeksy_20

FROM daneOracle
JOIN [prognoza].[dbo].[dane_podstawowe] dp -- UWAGA! Zakładam że tabela jest w schema dbo
ON daneOracle.[A_INDEX] = dp.[A_INDEX] -- UWAGA! Nie wiem jak ta kolumna z indeksem nazywa się w tabeli dane_podstawowe jeśli kolumna nazywa się inaczej popraw na prawidłową
) t
0

BlackBad tak, tabela jest w w schema dbo, oraz kolumna w obu tabelach ma taką samą nazwe.

"optymalniej" lubię to, ale nie potrafię. Dostałem dwa błędy,
**pierwszy, **

Msg 319, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, 
an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

z powyższym sobie poradziłem, pomógł średnik przed WITH. Jednak teraz zwracany jest inny błąd, na który już nie potrafię znaleźć rozwiązania.

Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'FROM'.

i to bez różnicy, czy apostrof jest za FROM czy za WHERE
w czym tkwi problem?

Jeżeli już została poruszona kwestia optymalniej, to mam problem z detetime, dla kolumny A_DATE_SUP, jak to zmienić, żeby po zapisaniu do tabeli lokalnej, był format daty bez czasu, czyli rok, miesiąc i dzień, maksymalnie 10 znaków, a nie 27. Nie chce przechowywać zbędnych znaków.

0

sprawdzam testuje i kombinuję, nawet jak przy zapytaniu do jednej bazy przeniosę apostrof na koniec zapytanie (za where) czyli zamiast

FROM TABELA2_INDEX INNER JOIN (TABELA3.DEST INNER JOIN TABELA1 ON (TABELA3.DEST.CC_C_DEST = TABELA1.A_C_DEST) AND (TABELA3.DEST.CC_CLIE = TABELA1.A_CLIE)) ON TABELA2.INDEX.EI_INDEX = TABELA1.A_INDEX')

WHERE A_DATE_SUP > '2017-01-01 00:00:00.0000000' AND EI_ORDRE = 1

zmienię na

FROM TABELA2_INDEX INNER JOIN (TABELA3.DEST INNER JOIN TABELA1 ON (TABELA3.DEST.CC_C_DEST = TABELA1.A_C_DEST) AND (TABELA3.DEST.CC_CLIE = TABELA1.A_CLIE)) ON TABELA2.INDEX.EI_INDEX = TABELA1.A_INDEX

WHERE A_DATE_SUP > '2017-01-01 00:00:00.0000000' AND EI_ORDRE = 1')

to otrzymuje komunikat
Msg 102, Level 15, State 1, Line 52
Incorrect syntax near '2017'.

jak usunę filtrowanie daty to działa prawidłowo.

FROM TABELA2_INDEX INNER JOIN (TABELA3.DEST INNER JOIN TABELA1 ON (TABELA3.DEST.CC_C_DEST = TABELA1.A_C_DEST) AND (TABELA3.DEST.CC_CLIE = TABELA1.A_CLIE)) ON TABELA2.INDEX.EI_INDEX = TABELA1.A_INDEX

WHERE EI_ORDRE = 1')

niestety nie wiem dlaczego.

2

Daj datę w dwóch '' (nie cudzysłów)

0

Marcin.Miga zapisana jak poniżej

WHERE A_DATE_SUP > ''2017-01-01 00:00:00.0000000'' AND EI_ORDRE = 1')

daje komunikat

OLE DB provider "MSDASQL" for linked server "REPLIKA_EU" returned message "[Oracle][ODBC][Ora]ORA-01861: literal does not match format string
".

1

To już spece od Ora muszą się wypowiedzieć. Albo wywal to po kropce, albo sformatuj dla Ora.

0

Marcin.Miga dzięki naprowadziłeś mnie, problem daty rozwiązany w SELECT`e

CAST(A_DATE_SUP AS DATE) A_DATE_SUP,

a filtrowanie

WHERE A_DATE_SUP > to_date(''2017-01-01'',''yyyy-mm-dd'') AND EI_ORDRE = 1') 

Natomiast próba osadzenia całości w CTE nadal kończy się komunikatem

Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'FROM'.

1

A musisz miec w CTE? Zrób jak w pierwszym poście.

0

Marcin.Miga masz rację, nie muszę, ale chciałem się nauczyć, na tą chwilę działa bez CTE.

1 użytkowników online, w tym zalogowanych: 0, gości: 1