2016-10-21 3 views
3

Когда я хочу выбрать все столбцы, ожидающие foo и bar, то, что я обычно делаю, просто явно перечисляет все остальные столбцы в инструкции select.Можно ли инвертировать оператор select в SQL?

select a, b, c, d, ... from ...

Но если таблица имеет дюжину столбцов, это трудоемкий процесс для простых средств. То, что я хотел бы сделать вместо этого, что-то вроде следующего утверждения псевдо:

select * except(foo, bar) from ...

Я также хотел бы знать, если есть функция, чтобы отфильтровать строки из результата, состоящий из нескольких столбцов , если несколько строк имеют одинаковый контент в все соответствующие столбцы. Другими словами, повторяющиеся строки будут отфильтрованы.

------------------------ 
A  | B  | C  
------------------------ ====> ------------------------ 
A  | B  | C     A  | B  | C 
------------------------    ------------------------ 
+1

Q1: № Q2: SELECT DISTINCT. – dnoeth

ответ

1

Вы можете создать представление на основе этой таблицы со всеми столбцами, кроме этих двух столбцов, а затем использовать этот вид каждый раз с

select * from view 

простой группой на всех колонке удалят такие дубликаты. есть и другие варианты - разные и row_number.

+0

Я понимаю, что ограничение не в состоянии сделать обратный выбор, так как это нарушит контракт между базой данных и клиентским приложением. Каждый запрос мог бы вернуть совершенно другой результат. Но это была бы удобная функция для быстрого наблюдения за столом. В виду создания вам нужно сделать еще больше работы для этого простого среднего и не подходит. –

+0

в порядке. Мое предположение заключалось в том, что вы используете эту таблицу без этих столбцов несколько раз. Это уменьшит ваши усилия за счет удобства использования этого sql. –

2

Вы можете запросить INFORMATION_SCHEMA БД и получить список столбцов (за исключением двух) для этой таблицы, например .:

SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<foo,bar>,', '') 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = '<your_table>' AND TABLE_SCHEMA = '<database>'; 

После того, как вы получите список столбцов, вы можете использовать это в вашем запросе на выборку.

0

select * except(foo, bar) from

Это часто запрашиваемая функция на SO. Однако он не дошел до стандарта SQL, и я не знаю каких-либо SQL-продуктов, которые его поддерживают. Я думаю, когда менеджеры продуктов спрашивают своих разработчиков, MVP, группы пользователей и т. Д., Чтобы измерить энтузиазм по этой предполагаемой функции, они в основном слышат: «SELECT * FROM считается опасным, нам нужно защитить новых пользователей, которые не знают, что они делают, и т. Д. «.

Возможно, вам будет полезно использовать NATURAL JOIN, а не INNER JOIN и т. Д., Который удаляет то, что было бы дублированным столбцом из результирующего выражения таблицы, например.

SELECT * 
    FROM Table1 t1 
     INNER JOIN Table2 t2 
      ON t1.foo = t2.foo 
      AND t1.bar = t2.bar; 

приведет в две колонки по имени foo и двух названных bar (и, возможно, другие повторяющиеся имена), вероятно, дублированные каким-то образом, например, путем суффикса имен переменных диапазона t1 и t2, что INNER JOIN заставил вас использовать.

Принимая во внимание:

SELECT * 
    FROM Table1 NATURAL JOIN Table2; 

не требует использования переменных диапазона (хорошая вещь), потому что там будет только один столбец с именем foo и один с именем bar в результате.

И, чтобы удалить дублированные строки, а также столбцы, изменили подразумеваемый SELECT ALL * на явный SELECT DISTINCT *, например.

SELECT DISTINCT * 
    FROM Table1 NATURAL JOIN Table2; 

Делать это может уменьшить потребность в SELECT ALL BUT { these columns } функции вы хотите.

Конечно, если вы это сделаете, вам скажут: «NATURAL JOIN считается опасным, мы должны защитить вас от вас, если вы не знаете, что делаете, и т. Д.» :)

Смежные вопросы