[MSSQL 2000] procedura kopiująca rekordy i indeks UNIQUE
Krzysztof Wiśniewski - 23-07-2007 00:02
[MSSQL 2000] procedura kopiująca rekordy i indeks UNIQUE
Jest sobie baza faktur. Dla każdej pozycji faktury w osobnej tabelce zapisywane są pewne "detale" (mniejsza o to, jakie to są dane). Mamy więc taką strukturę:
dbo.PozycjeFaktur: - IDPozycjiFaktury (klucz główny) - IDFaktury (identyfikator faktury)
dbo.PozycjeFaktur_Detale: - ID (klucz główny) - IDPozycjiFaktury (identyfikator pozycji faktury) - Detal
Muszę napisać procedurę, która zestaw "detali" przypisanych do jednej pozycji faktury przepisze do pozostałych pozycji faktury.
Wszystko byłoby proste, gdyby nie istniał indeks typu UNIQUE na polach: - IDPozycjiFaktury - Detal w tabeli "dbo.PozycjeFaktur_Detale". Zabezpiecza on przed wstawieniem do tej tabeli dwóch takich samych detali dla tej samej pozycji faktury.
Można by napisać tak:
INSERT INTO dbo.PozycjeFaktur_Detale (IDPozycjiFaktury, Detal) SELECT IDPozycjiFaktury, Detal FROM dbo.PozycjeFaktur_Detale INNER JOIN dbo.PozycjeFaktur ON dbo.PozycjeFaktur.IDPozycjiFaktury = dbo.PozycjeFaktur_Detale.IDPozycjiFaktury WHERE dbo.PozycjeFaktur.IDFaktury = @JakiesTamID
Jak w powyższym zapytaniu pominąć kombinacje "IDPozycjiFaktury + Detal", które już istnieją w tabeli "dbo.PozycjeFaktur_Detale", aby nie dopuścić do naruszenia klucza UNIQUE?
Pozdrawiam, Krzysiek
Pawel Potasinski - 24-07-2007 00:12
Na szybko coś takiego:
SELECT PF.IDPozycjiFaktury, D.Detal FROM dbo.PozycjeFaktur PF LEFT JOIN dbo.PozycjeFaktur_Detale PFD ON PF.IDPozycjiFaktury = PFD.IDPozycjiFaktury INNER JOIN (SELECT TOP 1 Detal FROM dbo.PozycjeFaktur_Detale PFD2 INNER JOIN dbo.PozycjeFaktur PF2 ON PF2.IDPozycjiFaktury = PFD2.IDPozycjiFaktury WHERE PFD2.IDPozycjiFaktury = PF2.IDPozycjiFaktury AND PF2.IDFaktury = @JakiesIDFaktury) D ON 1=1 WHERE PF.IDFaktury = @JakiesIDFaktury AND PFD.IDPozycjiFaktury IS NULL
Prawdopodobnie da się to zapisać tak, by uniknąć wpisywania zmiennej w dwóch miejscach.
-- Pozdrawiam Paweł Potasiński
Użytkownik "Krzysztof Wiśniewski" <ktuvok@poczta.onet.pl> napisał w wiadomości news:f7vvb6$r8f$1@news.onet.pl... > Jest sobie baza faktur. Dla każdej pozycji faktury w osobnej tabelce > zapisywane są pewne "detale" (mniejsza o to, jakie to są dane). Mamy więc > taką strukturę: > > dbo.PozycjeFaktur: > - IDPozycjiFaktury (klucz główny) > - IDFaktury (identyfikator faktury) > > dbo.PozycjeFaktur_Detale: > - ID (klucz główny) > - IDPozycjiFaktury (identyfikator pozycji faktury) > - Detal > > Muszę napisać procedurę, która zestaw "detali" przypisanych do jednej > pozycji faktury przepisze do pozostałych pozycji faktury. > > Wszystko byłoby proste, gdyby nie istniał indeks typu UNIQUE na polach: > - IDPozycjiFaktury > - Detal > w tabeli "dbo.PozycjeFaktur_Detale". Zabezpiecza on przed wstawieniem do > tej tabeli dwóch takich samych detali dla tej samej pozycji faktury. > > Można by napisać tak: > > INSERT INTO dbo.PozycjeFaktur_Detale > (IDPozycjiFaktury, Detal) > SELECT > IDPozycjiFaktury, Detal > FROM dbo.PozycjeFaktur_Detale > INNER JOIN dbo.PozycjeFaktur > ON dbo.PozycjeFaktur.IDPozycjiFaktury = > dbo.PozycjeFaktur_Detale.IDPozycjiFaktury > WHERE dbo.PozycjeFaktur.IDFaktury = @JakiesTamID > > Jak w powyższym zapytaniu pominąć kombinacje "IDPozycjiFaktury + Detal", > które już istnieją w tabeli "dbo.PozycjeFaktur_Detale", aby nie dopuścić > do naruszenia klucza UNIQUE? > > Pozdrawiam, > Krzysiek > >
Pawel Potasinski - 24-07-2007 00:12
Acha, oczywiście poprzedni post to był tylko SELECT, ale INSERT do tego dopisać nie jest sztuka :-)
-- Pozdrawiam Paweł Potasiński
Użytkownik "Krzysztof Wiśniewski" <ktuvok@poczta.onet.pl> napisał w wiadomości news:f7vvb6$r8f$1@news.onet.pl... > Jest sobie baza faktur. Dla każdej pozycji faktury w osobnej tabelce > zapisywane są pewne "detale" (mniejsza o to, jakie to są dane). Mamy więc > taką strukturę: > > dbo.PozycjeFaktur: > - IDPozycjiFaktury (klucz główny) > - IDFaktury (identyfikator faktury) > > dbo.PozycjeFaktur_Detale: > - ID (klucz główny) > - IDPozycjiFaktury (identyfikator pozycji faktury) > - Detal > > Muszę napisać procedurę, która zestaw "detali" przypisanych do jednej > pozycji faktury przepisze do pozostałych pozycji faktury. > > Wszystko byłoby proste, gdyby nie istniał indeks typu UNIQUE na polach: > - IDPozycjiFaktury > - Detal > w tabeli "dbo.PozycjeFaktur_Detale". Zabezpiecza on przed wstawieniem do > tej tabeli dwóch takich samych detali dla tej samej pozycji faktury. > > Można by napisać tak: > > INSERT INTO dbo.PozycjeFaktur_Detale > (IDPozycjiFaktury, Detal) > SELECT > IDPozycjiFaktury, Detal > FROM dbo.PozycjeFaktur_Detale > INNER JOIN dbo.PozycjeFaktur > ON dbo.PozycjeFaktur.IDPozycjiFaktury = > dbo.PozycjeFaktur_Detale.IDPozycjiFaktury > WHERE dbo.PozycjeFaktur.IDFaktury = @JakiesTamID > > Jak w powyższym zapytaniu pominąć kombinacje "IDPozycjiFaktury + Detal", > które już istnieją w tabeli "dbo.PozycjeFaktur_Detale", aby nie dopuścić > do naruszenia klucza UNIQUE? > > Pozdrawiam, > Krzysiek > >
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Zdalny =?ISO-8859-2?Q?dost=EAp_do_MSSQL_bez_zarz=B1dzani?==?ISO-8859-2?Q?a?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
[MSSQL 2k] - jak =?ISO-8859-2?Q?pod=B3=B1czy=E6_serwer_na_?==?ISO-8859-2?Q?porcie_innym_ni=BF_1433=3F?=
MSSQL Express czy Oracle Express
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
[MSSQL 2K] =?ISO-8859-2?Q?Wp=B3yw_ustawie=F1_regionalnych_?==?ISO-8859-2?Q?serwera_na_zapytania?=
Pobierananie danych z innej bazy danych w MSSQL
Migracja MSSQL 2005 CTP na 2005 Express
MSSQL , funkcja pobierajaca sama date (bez czasu) w funkcji
[mssql] insert do tabeli na podstawie danych z innej tabeli
zanotowane.pldoc.pisz.plpdf.pisz.planette.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|