Вопрос по sql – Как выбрать строку для вставки с тем же идентификатором в SQL?

1

так что в основном у меня есть таблица с именем & quot; table_1 & quot; :

ID   Index          STATUS          TIME        DESCRIPTION
1     15          pending           1:00       Started Pending
1     16          pending           1:05       still in request
1     17          pending           1:10       still in request
1     18          complete          1:20       Transaction has been completed
2     19          pending           2:25       request has been started
2     20          pending           2:30       in progress
2     21          pending           2:35       in progess still
2     22          pending           2:40       still pending
2     23          complete          2:45       Transaction Compeleted

Мне нужно вставить эти данные в мою вторую таблицу & quot; table_2 & quot; где включены только времена старта и соревнования, поэтому моя & quot; таблица_2 & quot; должно вот так:

ID   Index   STATUS          TIME          DESCRIPTION
1     15     pending         1:00          Started Pending
1     18     complete        1:20          Transaction has been completed
2     19     pending         2:25          request has been started
2     23     complete        2:45          Transaction Compeleted

если кто-то может помочь мне написать SQL-запрос для этого, я был бы очень признателен. заранее спасибо

вы бы посчитали идентификатор как конкретный идентификатор user1429595
Конкретным идентификатором в этом случае является вся строка. Первичный ключ - это все три поля Bilal Akil
Если у вас несколько одинаковых идентификаторов, они не являются идентификаторами. Возможно, вам следует пересмотреть свой дизайн. Jeff Watkins
Я здесь занимаюсь фристайлом, но думаю, что идентификация - это какая-то работа. Таким образом, у вас есть таблица JOB с PK, затем у вас будет какая-то таблица JOB_STATUS_HISTORY с FK-JOB и либо естественно уникальным ключом, либо суррогатным идентификатором, который будет уникальным. Я, вероятно, также каким-то образом абстрагирую ваше состояние, поскольку повторяющиеся строки могут быть хрупкими для будущего использования. Возможно, стоит подумать о том, чтобы на самом деле иметь «старт» состояние, то есть начало, ожидание, завершение и т. д. Хотя в этом случае ожидание, кажется, означает только то, что задание еще живо, поэтому в целом более подходящим был бы другой дизайн. Jeff Watkins

Ваш Ответ

4   ответа
0
INSERT INTO myTable2 (ID, STATUS, TIME, DESCRIPTION)
SELECT t1.ID, t1.STATUS, t1.TIME, t1.DESCRIPTION FROM table_1 as t1 
WHERE STATUS = 'complete' 
OR TIME = (SELECT min(TIME) FROM table_1 WHERE ID = t1.ID) 
ORDER BY ID asc, STATUS desc
2
INSERT INTO t2 (ID, STATUS, TIME)
SELECT ID, STATUS, MIN(TIME) FROM t1 t1top
WHERE EXISTS(SELECT * FROM t1 WHERE ID=t1top.ID AND STATUS='Complete')
GROUP BY ID, STATUS
ORDER BY CAST(ID AS UNSIGNED) ASC, STATUS DESC

как вставка сделана, если вы хотите увидеть результат в соответствии с вашим примером, вы должны выполнить следующее select:

SELECT ID, STATUS, TIME FROM table_1
ORDER BY CAST(ID AS UNSIGNED) ASC, STATUS DESC

это ТОЛЬКО ПРАВИЛЬНО, однако я не хочу просто ВИДЕТЬ его таким образом, он также должен быть вставлен во вторую таблицу таким образом, любая идея?

да, вышеупомянутый запрос вставлял дважды полные строки статуса. Удаление соединительной части устраняет проблему.
Я получаю синтаксическую ошибку, сообщение 156, уровень 15, состояние 1, строка 45 Неправильный синтаксис рядом с ключевым словом «ГДЕ». Я действительно ценю вашу помощь user1429595
это псевдоним для вашей основной таблицы t1, поэтому механизм не смешивается между «t1top»; который является верхним, и t1 из предложения EXISTS Но просто назовите его, как вам больше нравится
что такое t1top? извините я новичок user1429595
Во второй половине этого оператора будут выбраны все записи из t1, где status = «Complete». Мне кажется, что он должен иметь другое предложение, гарантирующее объединение только совпадающего объекта Complete с тем же идентификатором.
1
INSERT INTO table_2
SELECT id,status,min(time)
FROM table_1 AS t1
WHERE EXISTS(SELECT 1
             FROM table_1
             WHERE id=t1.id
                 AND status='complete')
GROUP BY id,status

Подожди меня глупо, ты не можешь сортировать вставку. Вам необходимо применить идентификатор ORDER BY, статус, когда вы выбираете из этой таблицы - например, SELECT * FROM table_2, идентификатор ORDER BY, статус
О сортировке - мой плохой, совсем забыл. Это там сейчас (эта новая нижняя строка). Если ожидающие и завершенные задания задом наперед, добавьте ключевое слово DESC после статуса в порядке. Мой мозг глуп, и я не могу понять, есть ли он или не должен быть там ...
к сожалению не сработало :( user1429595
Да, я просто добавляю проверку, чтобы убедиться, что Complete существует, - есть еще информация о том, как он не работает?
всем привет? он частично работал, но не сортировал их правильно, результат был 1 полный 2012-05-31 01: 20: 00.000 2 полный 2012-05-31 02: 45: 00.000 1 ожидающий 2012-05-31 01: 00: 00.000 2 в ожидании 2012-05-31 02: 25: 00.000 user1429595
0

все времена запуска, как это:

   select id, status, min(time) 
   from table_1 
   where status = 'Pending'
   group by id, status

затем завершение как это:

   select id, status, time
   from table_1 
   where status = 'Complete'
   group by id, status

Вы можете использовать union, чтобы использовать оба, и, конечно, попробуйте:

   insert into table_2

Похожие вопросы