Прокрутите таблицу, используйте условные обозначения, затем сохраните значение в другой таблице

89
6

Процедура заключается в заполнении столбца "Город" в таблице B на основе столбца "Письмо" из таблицы A.

ТАБЛИЦА А

+----------+-------+  
| Number | Letter|
+----------+-------+
| 1 | A |
| 1 | |
| 1 | |
| 2 | |
| 2 | |
| 3 | |
| 3 | B |
| 3 | |
| 3 | C |
+----------+-------+

ТАБЛИЦА B

+----------+-------+  
| AC | City |
+----------+-------+
| 1 | A |
| 1 | A |
| 1 | A |
| 1 | A |
| 2 | |
| 2 | |
| 2 | |
| 2 | |
| 3 | B |
| 3 | B |
| 3 | B |
+----------+-------+

Если AC = 1, обратитесь к Number = 1 и пропустите значения "Letter" сверху вниз, чтобы получить самое высокое значение.

Для Number = 1 самое верхнее значение - A, поэтому для AC = 1 заполните весь столбец "Город" как A.

Для AC = 2, Number = 2, и в таблице A нет значений, поэтому заполните все "Город" для каждого AC = 2 как незаполненные.

Для AC = 3, Number = 3, а самым верхним значением является B, поэтому заполните все "Город" для каждого AC = 3 как B.

Как вы это кодируете в стандартном SQL?

Я использую программное обеспечение Caspio и буду вставлять SQL в столбец "Город", но это не должно слишком сильно мешать с кодом.

Это то, что у меня есть до сих пор:

SELECT Letter
FROM TableA
WHERE TableA.Number = TableB.AC
AND TableA.Number != ""
LIMIT 1

Но, похоже, это не работает, и я считаю необходимым перебрать таблицу A, чтобы найти значение City для каждого AC = Number.

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ:

Я выяснил решение:

SELECT TOP 1 Letter
FROM TableA
WHERE Letter !='' AND Number=AC

Благодарю.

спросил(а) 2021-01-19T11:54:30+03:00 6 месяцев, 2 недели назад
1
Решение
78

Во-первых, не думайте о "петле" в SQL, это означает, что вы думаете о проблеме неправильно. Вы можете использовать основанное на множестве мышление.

Поэтому подумайте о том, что вы хотите сделать, а не о том, как вы хотите это сделать.

Вы хотите update the TableB.City based on the value of TableA.Letter

UPDATE TableB
SET City = Letter
FROM
(
SELECT Number, Letter,ROW_NUMBER () OVER ( PARTITION BY Number order by number ) AS SortOrder
FROM TableA
WHERE Letter IS NOT NULL AND Letter != ''
) AS A
WHERE A.SortOrder = 1 AND TableB.AC = A.number

Я включил сортировку Row_Number, это гарантирует, что вы получите первую букву. Обратите внимание, что вы должны заказать свой ПК, предположив, что у вас есть, и при условии, что это IDENTITY и int

См. SqlFiddle

EDIT Конечно, вы можете просто выбрать.

SELECT TableB.AC, A.Letter
FROM
(
SELECT Number, Letter,ROW_NUMBER () OVER ( PARTITION BY Number order by number ) AS SortOrder
FROM TableA
WHERE Letter IS NOT NULL AND Letter != ''
) AS A
LEFT OUTER JOIN TableB.AC = A.number
WHERE A.SortOrder = 1

ответил(а) 2021-01-19T11:54:30+03:00 6 месяцев, 2 недели назад
45

Это не работает, потому что вы не включаете tableB в предложение FROM или присоединяетесь к нему. Вы можете попробовать это:


    SELECT Letter FROM TableA WHERE Number IN 
(SELECT AC FROM TableB WHERE City!='' AND City IS NOT NULL)
AND Letter!='' AND LETTER IS NOT NULL

ответил(а) 2021-01-19T11:54:30+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема