MySQL как создать представление для работы с параметрами запроса - PullRequest
1 голос
/ 18 октября 2019

Работа с MySQL 8

У меня есть таблица cuenta_contable (это Self-Referential ) и следующие View:

CREATE VIEW cuenta_contable_union_view_with_code_32 AS
(
SELECT
    cc.code, cc.description
FROM
    cuenta_contable cc
WHERE
    cc.code = '32'
)
UNION
(
SELECT
    cc1.code,
    cc1.description
FROM
    cuenta_contable cc1
INNER JOIN
    cuenta_contable cc2
ON
    cc1.parent_cuenta_contable = cc2.id_cuenta_contable
WHERE
    cc2.code = '32'
)
ORDER BY
    code ASC;

и работает, как ожидается, он возвращает 8 строк.

Обратите внимание, что он использует:

  • cc.code = '32'
  • cc2.code = '32'

Подумайте, чтобы этот взгляд был более динамическим Мне нужно заменить эти два 32 на ?

  • cc.code = ?
  • cc2.code = ?

сделать следующее:

  • SELECT * FROM cuenta_contable_union_view_with_code WHERE cc.code='30' and cc2.code='30'
  • SELECT * FROM cuenta_contable_union_view_with_code WHERE cc.code='40' and cc2.code='40'

К сожалению,невозможно, если я использую ? в объявлении представления, тогда происходит:

SQL Error [1064] [42000]: You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near '?

Я прочитал другие сообщения, но работаю с Stored Procedures. В основном о:

В этом случае опция не используется Stored Procedures, поскольку существуетвозможность или риск в будущем изменить базу данных.

Я пытался использовать (два WHERE были удалены):

CREATE VIEW cuenta_contable_union_view_with_code AS
(
SELECT
    cc.code, cc.description
FROM
    cuenta_contable cc
)
UNION
(
SELECT
    cc1.code,
    cc1.description
FROM
    cuenta_contable cc1
INNER JOIN
    cuenta_contable cc2
ON
    cc1.parent_cuenta_contable = cc2.id_cuenta_contable
)
ORDER BY
    code ASC;

Поэтому, используя:

  • SELECT * FROM cuenta_contable_union_view_with_code;

Работает, но возвращает все - больше из 8

  • SELECT * FROM cuenta_contable_union_view_with_code WHERE code = '32';

Соблюдайте часть WHERE. Он возвращает только 1 строку, а не 8 как 'статическую' первую версию.

Следовательно, как решить эту проблему?

Мой худший сценарий - создатьмного «статичных» представлений, но это многословно и не очень практично

1 Ответ

2 голосов
/ 18 октября 2019

Как вы знаете, представления SQL не могут иметь параметров. Но вы можете отфильтровать их с помощью WHERE предложений и т. Д.

Это шаблон вашей задачи.

  CREATE VIEW something AS (
    SELECT item1, item2, item3, item4
      FROM ...
   );

Затем вы используете это представление следующим образом

 SELECT item2, item3, item4 
   FROM something
  WHERE item1 = 'constant'

Не слишком беспокоиться о производительности;планировщик запросов умеет оптимизировать запросы из представлений. В вашем случае это может выглядеть следующим образом.

CREATE VIEW cuenta_contable_union AS (
    SELECT cc.code, cc.description, cc.code selector_code
      FROM cuenta_contable cc
     UNION
    SELECT cc1.code, cc1.description, cc2.code selector_code
      FROM cuenta_contable cc1
      JOIN cuenta_contable cc2 
             ON cc1.parent_cuenta_contable = cc2.id_cuenta_contable
 );

Затем, чтобы использовать представление для выбора 32-значных элементов, выполните следующие действия:

SELECT code, description
  FROM cuenta_contable_union
 WHERE selector_code = 32
 ORDER BY code ASC;

В следующий раз это будет

SELECT code, description
  FROM cuenta_contable_union
 WHERE selector_code IN (10, 20, 30)
 ORDER BY code ASC;

или все, что требуется для вашего приложения.

Если таблица большая, это представление может быть быстрее, если вы используете UNION ALL вместо UNION.

...