Próbuję do INSERT INTO
tabeli przy użyciu danych wejściowych z innej tabeli. Chociaż jest to całkowicie wykonalne w przypadku wielu silników baz danych, zawsze wydaje mi się, że mam trudności z zapamiętaniem poprawnej składni SQL
silnika tego dnia ( MySQL , Oracle , SQL Server , Informix i DB2 ).
Czy istnieje składnia srebrnej kuli pochodząca ze standardu SQL (na przykład SQL-92 ), który pozwoliłby mi wstawiać wartości bez martwienia się o bazową bazę danych?
sql
database
syntax
database-agnostic
ansi-sql-92
Claude Houle
źródło
źródło
Odpowiedzi:
Próbować:
Jest to standardowy ANSI SQL i powinien działać na każdym DBMS
Zdecydowanie działa na:
źródło
Odpowiedź Claude'a Houle'a : powinna działać dobrze, możesz także mieć wiele kolumn i inne dane:
Użyłem tej składni tylko z Access, SQL 2000/2005 / Express, MySQL i PostgreSQL, więc należy je omówić. Powinien także współpracować z SQLite3.
źródło
Aby uzyskać tylko jedną wartość z wielu wartości
INSERT
z innej tabeli, wykonałem następujące czynności w SQLite3:źródło
INSERT
jest jednoVALUES
lub jednoSELECT
zdanie, a nie jedno i drugie.INSERT INTO ... VALUES ([expr], [expr], ...)
a jedną ze ścieżek[expr]
jest{{NOT} EXISTS} ([select-stmt])
- zauważ, że paranteza wokół instrukcji select jest wymagana ({}
co oznacza opcjonalne)Obie odpowiedzi, które widzę, działają dobrze w szczególności w Informix i są w zasadzie standardowym SQL. Oznacza to, że:
działa dobrze z Informix i, oczekiwałbym, z całym DBMS. (Kiedyś 5 lat temu było to coś, czego MySQL nie zawsze obsługiwał; teraz ma przyzwoitą obsługę tego rodzaju standardowej składni SQL i, AFAIK, działałoby OK na tej notacji.) Lista kolumn jest opcjonalny, ale wskazuje kolumny docelowe w sekwencji, więc pierwsza kolumna wyniku SELECT przejdzie do pierwszej wymienionej kolumny itp. W przypadku braku listy kolumn pierwsza kolumna wyniku SELECT przechodzi do pierwsza kolumna tabeli docelowej.
To, co może różnić się między systemami, to notacja używana do identyfikacji tabel w różnych bazach danych - standard nie ma nic do powiedzenia na temat operacji między bazami danych (nie mówiąc już o między DBMS). Dzięki Informix możesz użyć następującej notacji do identyfikacji tabeli:
Oznacza to, że możesz określić bazę danych, opcjonalnie identyfikując serwer, który obsługuje tę bazę danych, jeśli nie ma jej na bieżącym serwerze, a następnie opcjonalny właściciel, kropka i na koniec rzeczywista nazwa tabeli. Standard SQL używa terminu schemat do tego, co Informix nazywa właścicielem. Dlatego w Informix dowolne z poniższych oznaczeń mogą identyfikować tabelę:
Zasadniczo nie trzeba podawać właściciela; jeśli jednak używasz cudzysłowów, musisz poprawnie wpisać nazwę właściciela - w rozróżnianiu wielkości liter ma znaczenie. To jest:
wszystkie identyfikują ten sam stół. W przypadku Informix istnieje niewielka komplikacja z bazami danych MODE ANSI, w których nazwy właścicieli są zazwyczaj konwertowane na wielkie litery (wyjątek stanowi informix). Oznacza to, że w bazie danych MODE ANSI (niezbyt często używane) możesz napisać:
a nazwa właściciela w katalogu systemowym brzmiałaby „SOMEONE”, a nie „ktoś”. Jeśli umieścisz nazwę właściciela w podwójnych cudzysłowach, będzie to działało jak rozdzielany identyfikator. W standardowym języku SQL ograniczników można używać w wielu miejscach. Dzięki Informix możesz używać ich tylko wokół nazw właścicieli - w innych kontekstach Informix traktuje zarówno ciągi jedno-, jak i podwójnie cudzysłowy jako ciągi, a nie oddzielając ciągów jedno- i dwu-cytatowych jako ciągi, a ciągów podwójnych jako rozdzielane identyfikatory. (Oczywiście, dla kompletności, istnieje zmienna środowiskowa DELIMIDENT, którą można ustawić - na dowolną wartość, ale Y jest najbezpieczniejszy - aby wskazać, że podwójne cudzysłowy zawsze otaczają identyfikatory rozdzielane ograniczeniami, a pojedyncze cudzysłowy zawsze otaczają ciągi znaków.)
Zauważ, że MS SQL Server potrafi wykorzystać [identyfikatory rozdzielane] w nawiasach kwadratowych. Wydaje mi się to dziwne i na pewno nie jest częścią standardu SQL.
źródło
Aby dodać coś w pierwszej odpowiedzi, gdy chcemy tylko kilku rekordów z innej tabeli (w tym przykładzie tylko jednej):
źródło
Większość baz danych ma podstawową składnię,
Każda baza danych Użyłem obserwować tą składnię mianowicie
DB2
,SQL Server
,MY SQL
,PostgresQL
źródło
Zamiast
VALUES
częściINSERT
zapytania wystarczy użyćSELECT
zapytania jak poniżej.źródło
Dwa podejścia do wstawiania za pomocą wybranego zapytania częściowego.
1. Podejście do przy użyciu zapytania SELECT zwracającego wyniki z jednym wierszem .
W tym przypadku zakłada się, że zapytanie podrzędne WYBIERZ zwraca tylko jeden wiersz wyniku na podstawie GDZIE warunku lub funkcji agregujących SQL, takich jak SUMA, MAKS, AVG itp. W przeciwnym razie wygeneruje błąd
2. Podejście do zapytania Z SELECT zwraca wyniki z wieloma wierszami .
Drugie podejście będzie działać w obu przypadkach.
źródło
Można to zrobić bez określania kolumn w
INSERT INTO
części, jeśli podajesz wartości dla wszystkich kolumn wSELECT
części.Powiedzmy, że table1 ma dwie kolumny. To zapytanie powinno działać:
To NIE MOŻE działać (wartość
col2
nie jest określona):Używam MS SQL Server. Nie wiem, jak działają inne RDMS.
źródło
To kolejny przykład z użyciem wartości z select:
źródło
Proste wstawianie, gdy znana jest sekwencja kolumn tabeli:
Prosta wstawka z kolumną:
Wstawianie zbiorcze, gdy liczba wybranych kolumn tabeli (# tabela2) jest równa tabeli wstawiania (tabela1)
Wstawianie zbiorcze, jeśli chcesz wstawić tylko do żądanej kolumny tabeli (tabela 1):
źródło
Oto kolejny przykład, w którym źródło jest pobierane przy użyciu więcej niż jednej tabeli:
źródło
Wystarczy użyć nawiasów dla klauzuli SELECT w INSERT. Na przykład tak:
źródło
Oto jak wstawić z wielu tabel. W tym konkretnym przykładzie masz tabelę mapowania w scenariuszu wiele do wielu:
(Zdaję sobie sprawę, że dopasowanie nazwiska studenta może zwrócić więcej niż jedną wartość, ale masz pomysł. Dopasowanie czegoś innego niż identyfikator jest konieczne, gdy identyfikator jest kolumną tożsamości i jest nieznany).
źródło
Działa to na wszystkich DBMS
źródło
Możesz spróbować, jeśli chcesz wstawić całą kolumnę za pomocą
SELECT * INTO
tabeli.źródło
Właściwie wolę następujące w SQL Server 2008:
Eliminuje to etap dodawania zestawu Insert (), a Ty po prostu wybierasz, które wartości mają się znaleźć w tabeli.
źródło
To działało dla mnie:
To zdanie jest nieco inne niż Oracle.
źródło
W przypadku Microsoft SQL Server zalecę nauczenie się interpretowania SYNTAX podanego na MSDN. W Google łatwiej niż kiedykolwiek szukać składni.
W tym konkretnym przypadku spróbuj
Pierwszym wynikiem będzie http://msdn.microsoft.com/en-us/library/ms174335.aspx
przewiń w dół do przykładu („Używanie opcji WYBIERZ i WYKONAJ, aby wstawić dane z innych tabel”), jeśli masz trudności z interpretacją składni podanej na górze strony.
Powinno to mieć zastosowanie do wszelkich innych dostępnych RDBMS. Nie ma sensu zapamiętywać całej składni dla wszystkich produktów IMO.
źródło
źródło
Wygląda ładnie, ale działa tylko wtedy, gdy tmp nie istnieje (tworzy go i wypełnia). (Serwer SQL)
Aby wstawić do istniejącej tabeli tmp:
źródło
Najlepszy sposób na wstawienie wielu rekordów z dowolnych innych tabel.
źródło
Jeśli pójdziesz ścieżką WSTAW WARTOŚCI, aby wstawić wiele wierszy, upewnij się, że WARTOŚCI są rozdzielane w zestawy za pomocą nawiasów, więc:
W przeciwnym razie obiekty MySQL, które „Liczba kolumn nie zgadza się z liczbą wartości w wierszu 1”, a ty w końcu piszesz trywialny post, kiedy wreszcie zastanawiasz się, co z tym zrobić.
źródło
JEŚLI chcesz wstawić jakieś dane do tabeli bez potrzeby wpisywania nazwy kolumny.
Gdzie są tabele:
Wynik:
źródło
W informix działa tak, jak powiedział Claude:
źródło
Następnie obsługuje Postgres: utwórz tabelę company.monitor2 jako wybierz * z company.monitor;
źródło