LINUX.ORG.RU

sql union, delete


0

0

возможно удалить сразу несколько строк с разных таблиц, через одну команду ?

mysql# (delete from goods where id=3) UNION (delete from categories where id=6);

??


По-моему нет. Но уж точно не таким образом...

Ximen ★★★★
()

тебе нужны триггеры

Pi ★★★★★
()

таким образом - точно нет.

Можно покурить в сторону связанных таблиц, но в мускуле этим и не пахнет, если мне склероз конечно не изменяет

OldFornit
()
Ответ на: комментарий от josephson

>delete goods,categories from goods,categories where goods.id=3 or categories.id=6;

thx,

зы просто вроде как читал что через одну команду будет быстрей, чем
db->query('delete from goods where id=3');
db->query('delete from categories where id=6');

зыы пока есть время учиться, вот учусь =)

hose
() автор топика
Ответ на: комментарий от hose

^-) А... так тебе нужны транзакции. Вот про них и почитай. А если ты оптимизируешь 2 запроса в 1 и пиняешь на скорость... вобщем, лучше не стоит этот делать. Тем более в читабельности проиграешь.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

>^-) А... так тебе нужны транзакции. Вот про них и почитай. А если ты оптимизируешь 2 запроса в 1 и пиняешь на скорость... вобщем, лучше не стоит этот делать. Тем более в читабельности проиграешь.

ну скорее желании научиться, а не в скорости и читабельности
просто хотел узнать как это можно реализовать. =)

hose
() автор топика

Читаю и охреневаю. Человеку несколько строк надо удалить. Только один вспомнил про оператор "or" и никто не вспомнил про оператор "in".

Однако повылезали и триггеры и транзакции ... разве что про подзапросы никто не вспомнил :-) ... и всё наверно непременно в оракле должно быть :-)???

А потом ещё удивляемся, что секретарши для того, чтобы ужимать фотки с цифромыльницы включают в заявку на закупку ПО Photoshop CS3 :-)

r_asian ★☆☆
()
Ответ на: комментарий от Anoxemian

Вот как раз для понимания принципа все эти фичи в виде транзакций, триггеров и подзапросов и меньше всего нужны(и даже вредны).

У меня вообще иногда складывается стойкое впечатление, что всё это придумано для того, чтобы снизить пресловутый "порог вхождения" в SQL :-). По крайней мере, перебирая код, я всё чаще встречаю конструкции:

----------

select a.* from a where a.id in (select b.id from b where b.name='blabla')

вместо

select a.* from a left join b on a.b_id=b.id where b.name='blabla'

---------

start transaction; delete from a where a.id=1; delete from a where a.id=2; delete from a where a.id=3; commit;

вместо

delete from a where a.id in (1,2,3)

Все это конечно вещи полезные, но от необходимости знать теории это не освобождает :-) и от неоптимально написанного запроса при определённых объёмах данных не спасёт даже оракел.

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

select a.* from a where a.id in (select b.id from b where b.name='blabla')

заменить на

select a.* from a where a.b_id in (select b.id from b where b.name='blabla')

:-)

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

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

Может, тогда уж и сюда соображения выскажешь, всё ещё актуально: http://www.linux.org.ru/view-message.jsp?msgid=1954920

Anoxemian ★★★★★
()
Ответ на: комментарий от r_asian

Немного отформатирую, чтобы мне проще смотрелось.

SELECT 
    TBL1.IDN, 
    TBL1.PDATEN, 
    (TBL1.TOTAL - TBL2.TOTAL) AS TOTAL
FROM 
    [
        SELECT 
            LAST(ID) AS IDN, 
            LAST(PDATE) AS PDATEN, 
            SUM(OUTRUR + OUTCUR) AS TOTAL
        FROM 
            Balance
        WHERE
            TYPE = 'A' AND
            (
                ACCOUNT LIKE "319*" OR
                ACCOUNT LIKE "320*" OR
                ACCOUNT LIKE "321*" OR
                ACCOUNT LIKE "322*" OR
                ACCOUNT LIKE "323*" OR
                ACCOUNT = 80000 
            )
            OR
            ACCOUNT = 80000
        GROUP BY 
            ID, PDATE
    ]. AS TBL1 INNER JOIN 
    [
        SELECT 
            LAST(ID) AS IDN, 
            LAST(PDATE) AS PDATEN, 
            SUM(OUTRUR + OUTCUR) AS TOTAL
        FROM 
            Balance
        WHERE
            ACCOUNT = 80000
        GROUP BY 
            ID, PDATE
    ]. AS TBL2 ON 
    (TBL1.PDATEN = TBL2.PDATEN) 
        AND 
    (TBL1.IDN        = TBL2.IDN);


Хм. К сожалению почти не владею синтаксисом MS ACCESS
Попробую порассуждать вслух :-)

Предположительно есть табличка Balance

ID        - Какой-то ID
ACCOUNT   - Номер счёта
PDATE     - Дата
OUTRUR    - Денежка
OUTCUR    - Ещё какая-то денежка
TYPE      - тип

автор связывал 2 таблицы, каждая из которых формировалась запросом из неё

Главная:
-----------
IDN - последний ID 
PDATEN - последняя дата
TOTAL - сумма денежек

из групп записей с одним и тем же ID и датой. Каждая запись либо имеет отношение к счету 80000,
либо к типу A и одному из счетов вида "319*" "320*" "321*" "322*" "323*".

Подчинённая
------------
IDN - последний ID 
PDATEN - последняя дата
TOTAL - сумма денежек

из групп записей с одним и тем же ID и датой. Каждая запись имеет отношение к счету 80000

Связь через PDATE и ID.

Ну, приблизительно равноценна (на глазок) следующая замена


select
    last(TBL1.ID) as IDN -- Последний ID в группировке
    last(TBL1.PDATE) as PDATEN -- Последняя дата в группировке
    (
        SUM(TBL1.OUTRUR + TBL1.OUTCUR)-
        SUM(TBL2.OUTRUR + TBL2.OUTCUR)
    ) as TOTAL -- разница сумм денежек для 1-й таблици и связенной с ней 2-й
from 
    Balance as TBL1,
    Balance as TBL1
where
    (TBL2.ACCOUNT=80000) and    -- из 2-й - только для сцета 800000
    (
        TBL1.TYPE = 'A' AND
        (
            TBL1.ACCOUNT LIKE "319*" OR
            TBL1.ACCOUNT LIKE "320*" OR
            TBL1.ACCOUNT LIKE "321*" OR
            TBL1.ACCOUNT LIKE "322*" OR
            TBL1.ACCOUNT LIKE "323*" OR
            TBL1.ACCOUNT = 80000 
        ) 
        OR
        TBL1.ACCOUNT = 80000
    ) and --- из первой только для счета 80000 или одного из маски при типе A
    (TBL1.PDATE = TBL2.PDATE) AND -- свяжем таблицы через дату
    (TBL1.ID = TBL2.ID) -- свяжем таблицы через ID
GROUP BY 
      TBL1.ID, TBL1.PDATE -- сгруппируем записи сначала по ID, а потом по дате
    
 
Если что не так - не бейте :-)

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

О! Завтра заценю. А то пришлось обложиться костылями по самое немогу :-(

Anoxemian ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.