Как объединить временную таблицу с другой таблицей? - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь решить эту проблему для этой проблемы здесь. Мне нужно было написать команду SQL, которая проверяет наличие более одной строки в таблице SEQUENCE с одним и тем же TCKID. Если есть, то мне нужно было обновить и установить тип от 1 до 2 строки в таблице TICKETS с соответствующим TCKID.

Таблица билетов

enter image description here

Таблица последовательности

enter image description here

Это то, что я пытался сделать. Я пытаюсь подсчитать количество строк с одинаковым TCKID и сгруппировать их, а затем подсчитать их по группам. Я все еще пытаюсь использовать этот счетчик чисел, чтобы решить, какой TCKID появится в нескольких строках таблицы SEQUENCE, просто для обновления данных в таблице TICKETS. Я не уверен, нужно ли мне условие if-else или условие for l oop, или использовать INNER JOIN или OUTER JOIN для соединения временной таблицы с таблицей SEQUENCE или как таковой. Я нахожусь в точке, я не знаю, что я делаю.

UPDATE
    (SELECT TCKID, COUNT(*) AS TotalFlights
    FROM SEQUENCE
    GROUP BY TCKID)
JOIN SEQUENCE ON SEQUENCE.TCKID = TICKETS.TCKID
SET Type = '2'
WHERE TotalFlights > 1;

Это сообщение об ошибке, которое я получил. Код ошибки: 1248. Каждая производная таблица должна иметь свой собственный псевдоним

. Между тем,

SELECT TCKID, COUNT(*) AS TotalFlights
    FROM SEQUENCE
    GROUP BY TCKID

вернет временную таблицу.

enter image description here

Я не знаю, считается ли это жестким кодированием, но оно полностью работает для TCKID = от 1 до 16.

UPDATE TICKET SET Type = '2' WHERE TCKID = 1 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 1);

UPDATE TICKET SET Type = '2' WHERE TCKID = 2 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 2);

UPDATE TICKET SET Type = '2' WHERE TCKID = 3 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 3);

UPDATE TICKET SET Type = '2' WHERE TCKID = 4 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 4);

UPDATE TICKET SET Type = '2' WHERE TCKID = 5 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 5);

UPDATE TICKET SET Type = '2' WHERE TCKID = 6 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 6);

UPDATE TICKET SET Type = '2' WHERE TCKID = 7 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 7);

UPDATE TICKET SET Type = '2' WHERE TCKID = 8 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 8);

UPDATE TICKET SET Type = '2' WHERE TCKID = 9 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 9);

UPDATE TICKET SET Type = '2' WHERE TCKID = 10 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 10);

UPDATE TICKET SET Type = '2' WHERE TCKID = 11 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 11);

UPDATE TICKET SET Type = '2' WHERE TCKID = 12 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 12);

UPDATE TICKET SET Type = '2' WHERE TCKID = 13 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 13);

UPDATE TICKET SET Type = '2' WHERE TCKID = 14 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 14);

UPDATE TICKET SET Type = '2' WHERE TCKID = 15 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 15);

UPDATE TICKET SET Type = '2' WHERE TCKID = 16 AND
    (SELECT COUNT(*) > 1
    FROM SEQUENCE
    WHERE TCKID = 16);

SELECT * FROM TICKET;

enter image description here

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

1 Ответ

1 голос
/ 03 мая 2020

Вы можете попробовать использовать обновление с объединением в подзапросе
, например:

    UPDATE Tickets T
    INNER JOIN  ( SELECT TCKID, COUNT(*) 
        FROM SEQUENCE
        GROUP BY TCKID 
        HAVING count(*) > 1
        ) S ON T.TCKID = S.TCKID
    SET Type = '2'
...