Zastanawiam się, czy jest to możliwe w SQL. Załóżmy, że masz dwie tabele A i B i dokonujesz wyboru w tabeli A i dołączasz do tabeli B:
SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Jeśli tabela A ma kolumny „a_id”, „name” i „some_id”, a tabela B ma „b_id”, „name” i „some_id”, zapytanie zwróci kolumny „a_id”, „name”, „some_id ”,„ b_id ”,„ name ”,„ some_id ”. Czy jest jakiś sposób na prefiks nazw kolumn tabeli B bez wyszczególnienia każdej kolumny osobno? Odpowiednik tego:
SELECT a.*, b.b_id as 'b.b_id', b.name as 'b.name', b.some_id as 'b.some_id'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Ale, jak wspomniano, bez wyświetlania każdej kolumny, więc coś takiego:
SELECT a.*, b.* as 'b.*'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Zasadniczo coś do powiedzenia: „poprzedź każdą kolumnę zwróconą przez b. * Słowem„ coś ””. Czy to możliwe, czy nie mam szczęścia?
Z góry dziękuje za twoją pomoc!
EDYCJA: rada dotycząca nieużywania SELECT * i tak dalej jest poprawna rada, ale nie ma znaczenia w moim kontekście, więc proszę trzymać się omawianego problemu - czy można dodać prefiks (stałą określoną w zapytaniu SQL) do wszystkich nazwy kolumn tabeli w złączeniu?
EDYCJA: moim ostatecznym celem jest móc wykonać WYBÓR * na dwóch tabelach z łączeniem i móc stwierdzić na podstawie nazw kolumn, które otrzymuję w moim zestawie wyników, które kolumny pochodzą z tabeli A i które kolumny przyszły z tabeli B. Ponownie nie chcę wymieniać kolumn indywidualnie, muszę mieć możliwość WYBIERZ *.
Odpowiedzi:
Widzę tutaj dwie możliwe sytuacje. Po pierwsze, chcesz wiedzieć, czy istnieje do tego standard SQL, którego możesz ogólnie używać bez względu na bazę danych. Nie, nie ma. Po drugie, chcesz wiedzieć o konkretnym produkcie dbms. Następnie musisz go zidentyfikować. Ale wyobrażam sobie, że najbardziej prawdopodobną odpowiedzią jest to, że otrzymasz coś takiego jak „a.id, b.id”, ponieważ w ten sposób musisz zidentyfikować kolumny w wyrażeniu SQL. A najprostszym sposobem, aby dowiedzieć się, jakie są ustawienia domyślne, jest przesłanie takiego zapytania i sprawdzenie, co otrzymasz. Jeśli chcesz określić, jaki prefiks występuje przed kropką, możesz na przykład użyć polecenia „WYBIERZ * Z AS my_alias”.
źródło
Wygląda na to, że odpowiedź na twoje pytanie brzmi „nie”, jednak jednym z możliwych hacków jest przypisanie fikcyjnej kolumny do oddzielenia każdej nowej tabeli. Działa to szczególnie dobrze, jeśli przeglądasz zestaw wyników dla listy kolumn w języku skryptowym, takim jak Python lub PHP.
Zdaję sobie sprawę, że to nie odpowiada dokładnie na twoje pytanie, ale jeśli jesteś programistą, jest to świetny sposób na oddzielenie tabel ze zduplikowanymi nazwami kolumn. Mam nadzieję, że to komuś pomoże.
źródło
Całkowicie rozumiem, dlaczego jest to konieczne - przynajmniej dla mnie jest to przydatne podczas szybkiego prototypowania, gdy istnieje wiele tabel do połączenia, w tym wiele połączeń wewnętrznych. Gdy tylko nazwa kolumny będzie taka sama w drugiej dzikiej karcie pola „Jointable. *”, Wartości pól w głównej tabeli zostaną zastąpione wartościami Jointable. Podatne na błędy, frustrujące i naruszające SUSZENIE, gdy trzeba ręcznie określać pola tabeli za pomocą aliasów w kółko ...
Oto funkcja PHP (Wordpress), która pozwala to osiągnąć poprzez generowanie kodu wraz z przykładem jego użycia. W tym przykładzie jest on używany do szybkiego generowania niestandardowego zapytania, które zapewni pola pokrewnego wpisu wordpress, do którego odwołuje się zaawansowane pole niestandardowych pól .
Wyjście:
źródło
Jedyną znaną mi bazą danych, która to robi, jest SQLite, w zależności od ustawień konfigurowanych za pomocą
PRAGMA full_column_names
iPRAGMA short_column_names
. Zobacz http://www.sqlite.org/pragma.htmlW przeciwnym razie wszystko, co mogę polecić, to pobrać kolumny w zestawie wyników według pozycji porządkowej zamiast nazwy kolumny, jeśli wpisanie nazw kolumn w zapytaniu jest zbyt trudne.
To dobry przykład tego, dlaczego stosowanie złej praktyki jest takie
SELECT *
- ponieważ w końcu i tak będziesz musiał wpisać wszystkie nazwy kolumn.Rozumiem potrzebę obsługi kolumn, które mogą zmienić nazwę lub pozycję, ale używanie symboli wieloznacznych sprawia, że jest to trudniejsze , a nie łatwiejsze.
źródło
full_column_names
ishort_column_names
są przestarzałe w SQLite.Jestem w pewnym sensie tą samą łodzią co OP - mam dziesiątki pól z 3 różnych tabel, do których dołączam, z których niektóre mają tę samą nazwę (np. Identyfikator, nazwa itp.). Nie chcę wymieniać każdego pola, więc moim rozwiązaniem było aliasowanie pól o wspólnej nazwie i użycie opcji select * dla tych, które mają unikalną nazwę.
Na przykład :
tabela a: identyfikator, nazwa, pole 1, pole 2 ...
tabela b: identyfikator, nazwa, pole 3, pole 4 ...
wybierz a.id jako aID, a.name jako aName, a. *, b. id jako bID, b. nazwa jak bName, b. * .....
Uzyskując dostęp do wyników, używam pseudonimów dla tych pól i ignoruję nazwy „oryginalne”.
Może nie najlepsze rozwiązanie, ale działa dla mnie .... używam mysql
źródło
Różne produkty baz danych dają różne odpowiedzi; ale narażasz się na zranienie, jeśli posuniesz się tak daleko. O wiele lepiej jest wybrać kolumny, które chcesz, i nadać im własne aliasy, aby tożsamość każdej kolumny była krystalicznie czysta, a wyniki można odróżnić.
źródło
To pytanie jest bardzo przydatne w praktyce. Konieczne jest jedynie wyszczególnienie wszystkich wyraźnych kolumn w oprogramowaniu, w których zwracasz szczególną uwagę na wszystkie warunki.
Wyobraź sobie, że podczas debugowania lub spróbuj użyć DBMS jako codziennego narzędzia biurowego, zamiast czegoś, co można modyfikować, implementacji abstrakcyjnej infrastruktury określonego programisty, musimy napisać dużo SQL. Scenariusz można znaleźć wszędzie, np. Konwersja bazy danych, migracja, administracja itp. Większość tych SQL-ów zostanie wykonana tylko raz i nigdy więcej nie będzie używana, ponieważ nazwy każdej kolumny to tylko strata czasu. I nie zapominaj, że wynalazek SQL nie jest przeznaczony wyłącznie dla programistów.
Zwykle utworzę widok narzędzia z prefiksem nazw kolumn, tutaj jest funkcja w pl / pgsql, nie jest to łatwe, ale można przekonwertować ją na inne języki procedur.
Przykłady:
źródło
Całkowicie rozumiem twój problem związany ze zduplikowanymi nazwami pól.
Potrzebowałem tego też, dopóki nie zakodowałem własnej funkcji, aby ją rozwiązać. Jeśli używasz PHP, możesz go użyć lub napisać kod w języku, którego używasz, jeśli masz następujące możliwości.
Sztuczka polega na tym, że
mysql_field_table()
zwraca nazwę tabeli imysql_field_name()
pole dla każdego wiersza w wyniku, jeśli jest on dostępny,mysql_num_fields()
dzięki czemu można mieszać je w nowej tablicy.To poprzedza wszystkie kolumny;)
Pozdrowienia,
źródło
Nie ma na to standardu SQL.
Jednak w przypadku generowania kodu (na żądanie, gdy tabele są tworzone, zmieniane lub w czasie wykonywania), można to zrobić dość łatwo:
źródło
Są dwa sposoby, dzięki którym mogę to zrobić w sposób wielokrotnego użytku. Jednym z nich jest zmiana nazwy wszystkich kolumn z prefiksem dla tabeli, z której pochodzą. Widziałem to wiele razy, ale naprawdę mi się to nie podoba. Uważam, że jest zbędny, powoduje dużo pisania i zawsze możesz używać aliasów, gdy potrzebujesz zakryć przypadek nazwy kolumny o niejasnym pochodzeniu.
Innym sposobem, który zaleciłbym zrobić w twojej sytuacji, jeśli jesteś zaangażowany w to, jest tworzenie widoków dla każdej tabeli, która będzie aliasami nazw tabel. Następnie łączysz się z tymi widokami, a nie z tabelami. W ten sposób możesz swobodnie używać *, jeśli chcesz, możesz swobodnie korzystać z oryginalnych tabel z oryginalnymi nazwami kolumn, jeśli chcesz, a także ułatwia pisanie kolejnych zapytań, ponieważ już zmieniłeś nazwę w widokach.
Wreszcie nie jestem jasne, dlaczego musisz wiedzieć, z której tabeli pochodzi każda kolumna. Czy to ma znaczenie Najważniejsze są dane, które zawierają. Nie ma znaczenia, czy identyfikator użytkownika pochodzi z tabeli użytkownika, czy z tabeli pytań użytkownika. Ma to oczywiście znaczenie, gdy trzeba go zaktualizować, ale w tym momencie powinieneś już znać swój schemat na tyle dobrze, aby to ustalić.
źródło
Lub możesz użyć Red Gate SQL Refactor lub SQL Monit, który rozwija SELECT * w listy kolumn za pomocą kliknięcia przycisku Tab
więc w twoim przypadku, jeśli wpiszesz SELECT * FROM A JOIN B ... Idź na koniec *, przycisk Tab, voila! zobaczysz WYBIERZ A. kolumna 1, A. kolumna 2, ...., B. kolumna 1, B. kolumna 2 Z DOŁĄCZENIA B
Nie jest jednak darmowy
źródło
Nie możesz tego zrobić bez aliasingu, po prostu dlatego, jak zamierzasz odwoływać się do pola w klauzuli where, jeśli to pole istnieje w 2 lub 3 tabelach, do których dołączasz? Dla mysql nie będzie jasne, do którego chcesz się odwoływać.
źródło
Rozwiązałem podobny mój problem, zmieniając nazwy pól w odpowiednich tabelach. Tak, miałem zaszczyt to robić i rozumiem, że każdy może tego nie mieć. Dodałem przedrostek do każdego pola w tabeli reprezentującej nazwę tabeli. Zatem SQL wysłany przez OP pozostałby niezmieniony -
i nadal dają oczekiwane wyniki - łatwość identyfikacji, do której tabeli należą pola wyjściowe.
źródło
select * zwykle powoduje zły kod, ponieważ nowe kolumny często się dodają lub kolejność kolumn zmienia się dość często w tabelach, co zwykle psuje select * w bardzo subtelny sposób. Zatem wylistowanie kolumn jest właściwym rozwiązaniem.
Jeśli chodzi o sposób wykonania zapytania, nie jestem pewien co do mysql, ale w sqlserver możesz wybrać nazwy kolumn z syscolumns i dynamicznie zbudować klauzulę select.
źródło
Jeśli obawiasz się zmian schematu, może Ci się to przydać: 1. Uruchom zapytanie „Tabela DESCRIBE” na wszystkich zaangażowanych tabelach. 2. Użyj zwróconych nazw pól, aby dynamicznie skonstruować ciąg nazw kolumn poprzedzonych wybranym aliasem.
źródło
Istnieje bezpośrednia odpowiedź na twoje pytanie dla tych, którzy korzystają z MySQL C-API.
Biorąc pod uwagę SQL:
Wyniki z „mysql_stmt_result_metadata ()” podają definicję pól z przygotowanego zapytania SQL w strukturze MYSQL_FIELD []. Każde pole zawiera następujące dane:
Zwróć uwagę na pola: katalog, tabela, nazwa_Org
Teraz wiesz, które pola w twoim SQL należą do którego schematu (aka katalog) i tabeli. To wystarczy, aby ogólnie zidentyfikować każde pole na podstawie kwerendy sql z wieloma tabelami, bez konieczności aliasu.
Rzeczywisty produkt SqlYOG pokazuje wykorzystanie tych dokładnych danych w takim dworku, że są w stanie niezależnie aktualizować każdą tabelę połączenia wielostolikowego, gdy obecne są pola PK.
źródło
Rozwijając się z tego rozwiązania , podchodziłbym do problemu w następujący sposób:
Najpierw utwórz listę wszystkich
AS
instrukcji:Następnie użyj go w zapytaniu:
Może to jednak wymagać modyfikacji, ponieważ coś podobnego jest testowane tylko w SQL Server. Ale ten kod nie działa dokładnie w SQL Server, ponieważ USING nie jest obsługiwany.
Proszę o komentarz, jeśli możesz przetestować / poprawić ten kod np. Dla MySQL.
źródło
Ostatnio natknąłem się na ten problem w NodeJS i Postgres.
Podejście ES6
Nie znam żadnych funkcji RDBMS, które znają tę funkcję, dlatego utworzyłem obiekt zawierający wszystkie moje pola, np .:
Zdefiniowano reduktor do łączenia łańcuchów z nazwą tabeli:
Zwraca tablicę ciągów. Nazwij to dla każdej tabeli i połącz wyniki:
Wyjście końcowej instrukcji SQL:
źródło
Zaimplementowałem rozwiązanie oparte na odpowiedzi sugerującej użycie fikcyjnych lub wartowniczych kolumn w węźle. Użyłbyś go, generując SQL, taki jak:
A następnie przetworzenie wiersza, który otrzymałeś ze sterownika bazy danych, jak
addPrefixes(row)
.Implementacja (oparta na
fields
/rows
zwróconym przez mój sterownik, ale powinna być łatwa do zmiany dla innych sterowników DB):Test:
źródło
Używam programu Excel do połączenia procedury. Na przykład najpierw wybieram * i otrzymuję wszystkie kolumny, wklejam je do Excela. Następnie napisz kod, który muszę otoczyć kolumnę. Powiedzmy, że potrzebowałem reklamy prev do kilku kolumn. Chciałbym mieć moje pola w kolumnie i „jak poprzednio” w kolumnie B, a moje pola ponownie w kolumnie c. W kolumnie d miałbym kolumnę.
Następnie użyj konkatanatu w kolumnie e i połącz je razem, pamiętając o spacji. Następnie wytnij i wklej to do kodu SQL. Użyłem również tej metody do tworzenia instrukcji case dla tego samego pola i innych dłuższych kodów, które muszę zrobić dla każdego pola w tabeli z wieloma polami.
źródło
W postgres używam funkcji json, aby zamiast tego zwracać obiekty json .... następnie, po zapytaniu, dekoduję pola jsonem z przyrostkiem _json.
TO ZNACZY:
następnie w PHP (lub w innym języku), przeglądam zwrócone kolumny i json_decode () je, jeśli mają sufiks „_json” (również usuwam sufiks. Na koniec otrzymuję obiekt o nazwie „tab1”, który zawiera wszystkie pola tab1 i inne o nazwie „tab2”, które obejmuje wszystkie pola tab2.
źródło
PHP 7.2 + MySQL / Mariadb
MySQL wyśle Ci wiele pól o tej samej nazwie. Nawet w kliencie terminalowym. Ale jeśli chcesz mieć tablicę asocjacyjną, musisz samodzielnie wykonać klucze.
Dzięki @axelbrz za oryginał. Przeniesiłem go do nowszego php i trochę go wyczyściłem:
źródło