выполнить запрос, если значение в последней строке является правильным - PullRequest
0 голосов
/ 16 января 2019

Я хотел бы выполнить запрос, только если значение в последней строке является правильным. В моем примере, если значение в ColumnA равно 1 в последней строке, то я хочу запустить MyQuery. Но если значение не 1, остановитесь и ничего не делайте.

Я попробовал указать регистр и число (*), а также, если существует. но я продолжаю получать ошибку

SELECT CASE WHEN ((SELECT COUNT(*) FROM
    (Select a.* from table as a order by a.index desc limit 1) as b
        where b.ColumnA = 1)) > 0 )
THEN (MyQuery)
END

Я тоже пробовал, если существует, но он тоже не работает

if exists Select b.* from (Select a.* from table as a order by a.index desc limit 1) where b.ColumnA = 1
begin 
(MyQuery)
end

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

EDIT. Этот запрос будет выполняться по триггеру после каждой вставки в эту таблицу, цель которого состоит в том, чтобы не запускать MyQuery в строке, которая ему не требуется. MyQuery немного медленный, и большинству строк он не нужен.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Зависит от вашего запроса.

INSERT ...
    SELECT ... WHERE ...  -- this could lead to zero rows being inserted

DELETE ...
    WHERE NOT EXISTS ( SELECT ... )  -- this could lead to zero rows being deleted

UPDATE t1 JOIN t2 ...  -- the JOIN may cause no rows to be updated

Примечание:

(Select a.* from table as a order by a.index desc limit 1) as b
    where b.ColumnA = 1)) > 0 )

можно упростить (и ускорить) до

( ( SELECT ColumnA FROM table ORDER BY index DESC LIMIT 1 ) = 1 )

Обратите внимание, что это "истинное / ложное" выражение ", поэтому его можно использовать в разных местах.

0 голосов
/ 16 января 2019

Я думаю, что мы можем перефразировать вашу логику здесь, чтобы она работала так, как вы хотите:

WITH cte AS (
    SELECT ColumnA, ROW_NUMBER() OVER (ORDER BY index DESC) rn
    FROM yourTable
)

(your query here)
WHERE (SELECT ColumnA FROM cte WHERE rn = 1) = 1;

Приведенное выше предложение WHERE вернет либо true, либо false, и будет применяться ко всем записям в потенциальном наборе результатов из вашего запроса. То есть, если бы значение ColumnA из «последней» записи было равно 1, вы бы вернули весь набор результатов, в противном случае это был бы пустой набор.

Предполагая, что ваша версия MariaDB не поддерживает ни ROW_NUMBER, ни CTE, используйте:

(your query here)
WHERE (SELECT ColumnA FROM yourTable ORDER BY index DESC LIMIT 1) = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...