Создание MySQL View с использованием UNION - PullRequest
9 голосов
/ 05 февраля 2009

Я пытаюсь создать представление для следующего запроса.

SELECT DISTINCT
  products.pid        AS id,
  products.pname      AS name,
  products.p_desc     AS description,
  products.p_loc      AS location,
  products.p_uid      AS userid,
  products.isaproduct AS whatisit
FROM products
UNION
SELECT DISTINCT
  services.s_id       AS id,
  services.s_name     AS name,
  services.s_desc     AS description,
  services.s_uid      AS userid,
  services.s_location AS location,
  services.isaservice AS whatisit
FROM services

Но не в состоянии это сделать. Я использую браузер запросов MySql. Я получаю ошибку:

Представление может быть создано только из активного набора результатов команды SELECT

Может кто-нибудь помочь мне с этим?

Ответы [ 5 ]

7 голосов
/ 05 февраля 2009
CREATE VIEW vw_product_services AS
SELECT DISTINCT products.pid AS id,
                products.pname AS name,
                products.p_desc AS description,
                products.p_loc AS location,
                products.p_uid AS userid,
                products.isaproduct AS whatisit
           FROM products
          UNION
          SELECT DISTINCT services.s_id AS id,
                services.s_name AS name,
                services.s_desc AS description,
                services.s_uid AS userid,
                services.s_location AS location,
                services.isaservice AS whatisit
           FROM services

Я попробовал это, и это сработало! Спасибо всем:)

3 голосов
/ 05 февраля 2009

Возможно, вы захотите изменить порядок идентификатора пользователя и местоположения при втором выборе. Имена столбцов должны совпадать с 1 по 1 во всех выборках объединения.

РЕДАКТИРОВАТЬ: для браузера запросов, как this указывает: «Чтобы создать представление из запроса, вы должны выполнить запрос успешно. Чтобы быть более точным, представление создается из последнего успешно выполненного запрос, необязательно из запроса, который в данный момент находится в области запросов "

, поэтому вам нужно сначала выполнить запрос, прежде чем создавать представление в браузере запросов.

Ошибка из браузера запросов, а не mysql.

1 голос
/ 05 февраля 2009

Просто небольшое замечание о UNION. UNION возвращает только отдельные значения вашего набора результатов. Поэтому нет необходимости использовать SELECT DISTINCT в сочетании с UNION. Возможно, для производительности лучше не использовать DISTINCT.

Более подробную информацию о UNION можно найти здесь: Оператор SQL UNION

1 голос
/ 05 февраля 2009

Различные типы объединяются в один и тот же столбец. (Имена могут быть разными, но типы должны быть одинаковыми или, по крайней мере, автоматически загружаемыми.) Но, как указывает @Learning, похоже, что вы исказили перечисления столбцов SELECT.

На всякий случай правильный синтаксис (который работал для меня) -

CREATE VIEW myView 
AS  
SELECT ... 
0 голосов
/ 05 февраля 2009

Сообщение об ошибке находится в «QueryBrowser.pas», часть mysql-gui-tools .

procedure TQueryBrowserForm.SQLCreateViewClick(Sender: TObject);
// ... 
begin
  if Assigned(ActiveResultset) and (ActiveResultset.ResultSet.query.query_type = MYX_QT_SELECT)then
    // ... 
  else
    ShowError('Creation error', _('A view can only be created from a active resultset of SELECT command.'), []);
end;

Это вызвано тем, что a) не имеет активного набора результатов и b) запрос имеет неправильный тип.

Имеет ли какое-нибудь значение удаление "DISTINCT"? В любом случае, это ошибка в QueryBrowser, а не один MySQL. Создание представления непосредственно в MySQL должно быть достаточным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...