Мне интересно, возможно ли это в SQL. Допустим, у вас есть две таблицы A и B, и вы делаете выбор в таблице A и присоединяетесь к таблице B:
SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Если в таблице A есть столбцы «a_id», «name» и «some_id», а в таблице B «b_id», «name» и «some_id», запрос вернет столбцы «a_id», «name», «some_id». ',' b_id ',' name ',' some_id '. Можно ли как-нибудь добавить префиксы к именам столбцов таблицы B, не перечисляя каждый столбец отдельно? Эквивалент этого:
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);
Но, как уже упоминалось, без перечисления каждого столбца, так что-то вроде:
SELECT a.*, b.* as 'b.*'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
По сути, что-то сказать: «ставьте перед каждым столбцом, возвращаемым b. *, Префикс« что-то »». Это возможно или мне не повезло?
Заранее спасибо за вашу помощь!
РЕДАКТИРОВАТЬ: рекомендация не использовать SELECT * и т. Д. Является действительной рекомендацией, но не имеет отношения к моему контексту, поэтому, пожалуйста, придерживайтесь рассматриваемой проблемы - возможно ли добавить префикс (константу, указанную в запросе SQL) ко всем имена столбцов таблицы в объединении?
РЕДАКТИРОВАТЬ: моя конечная цель состоит в том, чтобы иметь возможность выполнять SELECT * для двух таблиц с объединением и иметь возможность определять по именам столбцов, которые я получаю в моем наборе результатов, какие столбцы получены из таблицы A и какие столбцы получены из таблицы B. Опять же, я не хочу, чтобы список столбцов индивидуально, мне нужно иметь возможность сделать SELECT *.
Ответы:
Я вижу две возможные ситуации здесь. Во-первых, вы хотите знать, существует ли для этого стандарт SQL, который вы можете использовать в целом независимо от базы данных. Нет, нет Во-вторых, вы хотите знать о конкретном продукте DBMS. Тогда вам нужно идентифицировать это. Но я предполагаю, что наиболее вероятным ответом будет то, что вы получите что-то вроде «a.id, b.id», поскольку именно так вам нужно будет идентифицировать столбцы в выражении SQL. И самый простой способ узнать, что является значением по умолчанию, это просто отправить такой запрос и посмотреть, что вы получите обратно. Если вы хотите указать, какой префикс ставится перед точкой, вы можете использовать, например, «SELECT * FROM a AS my_alias».
источник
Похоже, что ответ на ваш вопрос - нет, однако один из способов, который вы можете использовать, - назначить фиктивный столбец для разделения каждой новой таблицы. Это особенно хорошо работает, если вы просматриваете набор результатов для списка столбцов на языке сценариев, таких как Python или PHP.
Я понимаю, что это не дает точного ответа на ваш вопрос, но если вы программист, это отличный способ разделить таблицы с повторяющимися именами столбцов. Надеюсь, это кому-нибудь поможет.
источник
Я полностью понимаю, почему это необходимо - по крайней мере, для меня это удобно при быстром прототипировании, когда необходимо объединить множество таблиц, включая множество внутренних объединений. Как только имя столбца совпадает со вторым подстановочным знаком поля "jointable. *", Значения полей основной таблицы заменяются значениями объединяемой таблицы. Склонность к ошибкам, разочарование и нарушение DRY при необходимости вручную указывать поля таблицы с псевдонимами снова и снова ...
Вот функция PHP (Wordpress) для достижения этой цели посредством генерации кода вместе с примером того, как ее использовать. В этом примере он используется для быстрой генерации пользовательского запроса, который предоставит поля связанной публикации WordPress, на которую ссылается расширенное поле пользовательских полей .
Выход:
источник
Единственная известная мне база данных, которая делает это, - это SQLite, в зависимости от настроек, которые вы конфигурируете
PRAGMA full_column_names
иPRAGMA short_column_names
. Смотрите http://www.sqlite.org/pragma.htmlВ противном случае все, что я могу порекомендовать, - это выбирать столбцы в результирующем наборе по порядковому положению, а не по имени столбца, если вам слишком сложно набирать имена столбцов в вашем запросе.
Это хороший пример того, почему это плохая практика
SELECT *
- потому что в конечном итоге вам все равно придется печатать все имена столбцов.Я понимаю необходимость поддержки столбцов, которые могут изменить имя или положение, но использование подстановочных знаков усложняет , а не облегчает.
источник
full_column_names
иshort_column_names
являются устаревшими в SQLite.Я нахожусь в той же лодке, что и OP - у меня есть десятки полей из 3 разных таблиц, к которым я присоединяюсь, некоторые из которых имеют одинаковые имена (т. Е. Id, name и т. Д.). Я не хочу перечислять каждое поле, поэтому мое решение состояло в том, чтобы создать псевдоним для тех полей, которые имеют общее имя, и использовать select * для тех, которые имеют уникальное имя.
Например :
таблица а: идентификатор, имя, поле1, поле2 ...
таблица b: идентификатор, имя, поле3, поле4 ...
выберите a.id в качестве aID, a.name в качестве aName, a. *, b.id как bID, b.name как bName, b. * .....
При доступе к результатам я использую псевдонимы для этих полей и игнорирую «оригинальные» имена.
Может быть, не лучшее решение, но оно работает для меня .... Я использую MySQL
источник
Продукты разных баз данных дадут вам разные ответы; но ты настраиваешь себя на боль, если ты несешь это очень далеко. Вам гораздо лучше выбрать нужные столбцы и дать им собственные псевдонимы, чтобы идентификация каждого столбца была кристально ясной, и вы сможете различить их в результатах.
источник
Этот вопрос очень полезен на практике. Необходимо только перечислить все явные столбцы в программном программировании, где вы уделяете особое внимание выполнению всех условий.
Представьте себе, что при отладке или попробуйте использовать СУБД в качестве инструмента ежедневной работы, вместо того, чтобы что-то изменить реализацию абстрактной базовой инфраструктуры конкретного программиста, нам нужно кодировать много SQL. Сценарий можно найти повсюду, например, преобразование базы данных, миграция, администрирование и т. Д. Большинство этих SQL-запросов будут выполняться только один раз и никогда не будут использоваться снова, так как имена каждого столбца - просто трата времени. И не забывайте, что изобретение SQL предназначено не только для программистов.
Обычно я создаю служебное представление с префиксом имен столбцов, здесь есть функция в pl / pgsql, это нелегко, но вы можете преобразовать ее в другие языки процедур.
Примеры:
источник
Я полностью понимаю вашу проблему с дублированными именами полей.
Мне это тоже нужно, пока я не закодировал свою собственную функцию для ее решения. Если вы используете PHP, вы можете использовать его или кодировать свой язык на котором вы используете, если у вас есть следующие возможности.
Хитрость в том, что
mysql_field_table()
возвращает имя таблицы иmysql_field_name()
поле для каждой строки в результате, если он получен,mysql_num_fields()
чтобы вы могли смешать их в новом массиве.Это префикс всех столбцов;)
С Уважением,
источник
Для этого не существует стандарта SQL.
Однако с генерацией кода (по требованию, когда таблицы создаются или изменяются, или во время выполнения), вы можете сделать это довольно легко:
источник
Есть два способа, которыми я могу придумать, чтобы это произошло многократно. Одним из них является переименование всех ваших столбцов с префиксом таблицы, из которой они получены. Я видел это много раз, но мне действительно это не нравится. Я считаю, что это избыточно, вызывает много печатания, и вы всегда можете использовать псевдонимы, когда вам нужно охватить случай с именем столбца, имеющего неясное происхождение.
Другой способ, который я бы порекомендовал вам сделать в вашей ситуации, если вы полны решимости добиться этого, - это создать представления для каждой таблицы, которые имеют псевдонимы имен таблиц. Затем вы присоединяетесь к этим представлениям, а не к таблицам. Таким образом, вы можете свободно использовать *, если хотите, свободно использовать исходные таблицы с исходными именами столбцов, если хотите, и это также облегчает написание любых последующих запросов, поскольку вы уже выполнили работу по переименованию в представлениях.
Наконец, мне непонятно, зачем вам знать, из какой таблицы пришел каждый столбец. Имеет ли это значение? В конечном итоге важны данные, которые они содержат. На самом деле не имеет значения, был ли идентификатор пользователя получен из таблицы User или из таблицы UserQuestion. Конечно, имеет значение, когда вам нужно обновить его, но на этом этапе вы уже должны знать свою схему достаточно хорошо, чтобы определить это.
источник
Или вы можете использовать Red Gate SQL Refactor или SQL Prompt, который расширяет ваш SELECT * в списки столбцов нажатием кнопки Tab.
так что в вашем случае, если вы наберете SELECT * FROM A JOIN B ... Перейти к концу *, кнопка Tab, вуаля! вы увидите ВЫБРАТЬ A.column1, A.column2, ...., B.column1, B.column2 ОТ СОЕДИНЕНИЯ B
Это не бесплатно, хотя
источник
Не могу сделать это без псевдонимов, просто потому что, как вы собираетесь ссылаться на поле в предложении where, если это поле существует в 2 или 3 таблицах, к которым вы присоединяетесь? Для mysql будет неясно, на какой из них вы пытаетесь ссылаться.
источник
Я решил похожую проблему, переименовав поля в соответствующих таблицах. Да, я имел честь сделать это и понимаю, что у всех может не быть этого. Я добавил префикс для каждого поля в таблице, представляющей имя таблицы. Таким образом, SQL, отправленный OP, останется неизменным -
и все же дать ожидаемые результаты - простота определения, к какой таблице принадлежат поля вывода.
источник
select * обычно делает для плохого кода, так как новые столбцы имеют тенденцию добавляться, или порядок столбцов изменяется в таблицах довольно часто, что обычно ломает select * очень тонкими способами. Таким образом, перечисление столбцов является правильным решением.
Что касается того, как сделать ваш запрос, не уверен насчет mysql, но в sqlserver вы можете выбрать имена столбцов из syscolumns и динамически создать предложение select.
источник
Если вас беспокоит изменение схемы, это может сработать для вас: 1. Запустите запрос «DESCRIBE table» для всех задействованных таблиц. 2. Используйте возвращенные имена полей для динамического построения строки имен столбцов с префиксом выбранного псевдонима.
источник
Существует прямой ответ на ваш вопрос для тех, кто использует MySQL C-API.
Учитывая SQL:
Результаты mysql_stmt_result_metadata () дают определение ваших полей из подготовленного SQL-запроса в структуру MYSQL_FIELD []. Каждое поле содержит следующие данные:
Обратите внимание на поля: каталог, таблица, имя_организации
Теперь вы знаете, какие поля в вашем SQL принадлежат какой схеме (или каталогу) и таблице. Этого достаточно, чтобы в общем идентифицировать каждое поле из многотабличного SQL-запроса без необходимости создавать псевдонимы.
Фактический продукт SqlYOG демонстрирует использование этих точных данных таким образом, что они могут независимо обновлять каждую таблицу объединения нескольких таблиц, когда присутствуют поля PK.
источник
Исходя из этого решения , я бы подошел к проблеме:
Сначала создайте список всех
AS
утверждений:Затем используйте его в своем запросе:
Однако для этого могут потребоваться изменения, поскольку нечто подобное тестируется только в SQL Server. Но этот код не совсем работает в SQL Server, потому что USING не поддерживается.
Прокомментируйте, если вы можете проверить / исправить этот код, например, для MySQL.
источник
Недавно столкнулся с этой проблемой в NodeJS и Postgres.
ES6 подход
Я не знаю каких-либо функций СУБД, которые бы обеспечивали эту функцию, поэтому я создал объект, содержащий все мои поля, например:
Определен редуктор для объединения строк вместе с именем таблицы:
Это возвращает массив строк. Назовите это для каждой таблицы и объедините результаты:
Выведите окончательный оператор SQL:
источник
Я реализовал решение, основанное на ответе, предложив использовать пустые или контрольные столбцы в узле. Вы бы использовали его, генерируя SQL как:
А затем постобработка строки, которую вы возвращаете из своего драйвера базы данных, как
addPrefixes(row)
.Реализация (на основе
fields
/rows
возвращенная моим драйвером, но должна быть легко изменить для других драйверов БД):Тест:
источник
Что я делаю, это использую Excel для объединения процедуры. Например, сначала я выбираю * и получаю все столбцы, вставляю их в Excel. Затем напишите код, который мне нужен, чтобы окружить колонку. Скажем, мне нужно было рекламировать предыдущую группу столбцов. Я бы имел мои поля в столбце и «как предыдущий» в столбце B, а мои поля снова в столбце c. В столбце d у меня будет столбец.
Затем используйте concatanate в столбце e и объедините их вместе, указав пробелы. Затем вырезать и вставить это в ваш код SQL. Я также использовал этот метод для создания операторов case для того же поля и других более длинных кодов, которые мне нужно сделать для каждого поля в таблице из нескольких сотен полей.
источник
В postgres я использую функции json, чтобы вместо этого возвращать объекты json .... затем, после запроса, я json_decode поля с суффиксом _json.
IE:
затем в PHP (или любом другом языке) я перебираю возвращаемые столбцы и json_decode () их, если они имеют суффикс "_json" (также удаляя суффикс. В конце я получаю объект с именем "tab1", который включает в себя все поля tab1, а другое называется tab2, которое включает все поля tab2.
источник
PHP 7.2 + MySQL / Mariadb
MySQL отправит вам несколько полей с одним и тем же именем. Даже в терминальном клиенте. Но если вам нужен ассоциативный массив, вам придется создавать ключи самостоятельно.
Спасибо @axelbrz за оригинал. Я портировал его на новый php и немного его почистил:
источник