Как определить строку по дате и повторяющемуся идентификатору? - PullRequest
0 голосов
/ 21 февраля 2019

я прихожу сюда снова, чтобы попросить о помощи с тем, чего я до сих пор не могу достичь

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

Допустим, у меня есть Excel, где размещена вся информация, и я хотел переместить несколько строк втаблица, единственными данными которой являются некоторые идентификаторы, которые уже существуют с 1 по 1600, в настоящее время выглядит примерно так:

dbo_expedient

expedient_id|sheet_number|data_expedient_entry|expedient_address|
1           | NULL       | NULL               | NULL            |
2           | NULL       | NULL               | NULL            |
3           | NULL       | NULL               | NULL            |
4           | NULL       | NULL               | NULL            |
5           | NULL       | NULL               | NULL            |
6           | NULL       | NULL               | NULL            |
7           | NULL       | NULL               | NULL            |
8           | NULL       | NULL               | NULL            |

, с другой стороны, у нас есть исходная таблица, в которой содержится информацияхранится и выглядит так:

data_db

sheet_number|expedient_entry_data|name_expedient_owner|expedient_address|
1           | 01-01-2019         | you                | nowhere 123     |
2           | 01-01-2019         | me                 | somewhere 456   |
3           | 03-01-2019         | they               | anywhere 789    |
4           | 04-01-2019         | us                 | any place 1111  |
5           | 05-01-2019         | we                 | everywhere 2222 |
6           | 06-01-2019         | all                | right here 3333 |
7           | 07-01-2019         | he                 | right there 4444|
8           | 08-01-2019         | her                | over there 5555 |

Итак, большая проблема, с которой я сталкиваюсь, заключается в том, что я делаю соединение с полем номера листа, и это полепросто ограниченное количество (иногда не превышает 800 и начинается снова с номера 1), это потому, что это число начинается снова в год, скажем, мыВ 2017 году 800 листов, на 2018 год у нас 700, но если я попытаюсь вставить эти 800 из 2017, он только вставит эти 800, а затем остановится, выпуская 700 строк из 2018 года, я попросил напарника, как этого добиться, и онсказал мне указывать каждую строку по году и номеру листа, но я понятия не имею, как я могу это сделать, если вы можете мне помочь, это будет много значить для меня, заранее спасибо, я буду следить за любымвопросы.

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

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

UPDATE X
SET X.sheet_number= Z.sheet_number
FROM dbo_expedient X
JOIN data_db Z ON Z.sheet_number=X.expedient_id

В настоящее время я присоединяюсь к номеру листа и идентификатору целесообразности, но он останавливается, поскольку номера листов ограничены и начинаются снова в определенной точке, идентификаторы удачно размещены.

1 Ответ

0 голосов
/ 04 марта 2019

Вот один из способов сделать это.

Нам нужна последовательность растущих уникальных чисел без пробелов для таблиц dbo_expedient и data_db для сопоставления / сопоставления / объединения их строк.

Мы можем использовать функцию ROW_NUMBER для генерации такой последовательности.

Сначала рассмотрим простые SELECT запросы, которые демонстрируют, что происходит.

SELECT
    expedient_id
    ,sheet_number
    ,data_expedient_entry
    ,expedient_address
    ,ROW_NUMBER() OVER (ORDER BY expedient_id) AS rn
FROM dbo_expedient
ORDER BY expedient_id
;

Если expedient_id в dbo_expedient гарантированно будет последовательность, начинающаяся с 1 без пробелов, тогда вы можете использовать expedient_id напрямую, без ROW_NUMBER.

SELECT
    sheet_number
    ,expedient_entry_data
    ,name_expedient_owner
    ,expedient_address
    ,ROW_NUMBER() OVER (ORDER BY YEAR(expedient_entry_data), sheet_number) AS rn
FROM data_db
ORDER BY YEAR(expedient_entry_data), sheet_number
;

Теперь соедините их вместе в столбце rn,Наиболее читаемый способ - использовать Common Table Expressions (CTE).

WITH
CTE_Dst
AS
(
    SELECT
        expedient_id
        ,sheet_number
        ,data_expedient_entry
        ,expedient_address
        ,ROW_NUMBER() OVER (ORDER BY expedient_id) AS rn
    FROM dbo_expedient
)
,CTE_Src
AS
(
    SELECT
        sheet_number
        ,expedient_entry_data
        ,name_expedient_owner
        ,expedient_address
        ,ROW_NUMBER() OVER (ORDER BY YEAR(expedient_entry_data), sheet_number) AS rn
    FROM data_db
)
SELECT
     CTE_Src.sheet_number AS src_sheet_number
    ,CTE_Src.expedient_entry_data AS src_expedient_entry_data
    ,CTE_Src.name_expedient_owner AS src_name_expedient_owner
    ,CTE_Src.expedient_address AS src_expedient_address
    ,CTE_Dst.expedient_id AS dst_expedient_id
    ,CTE_Dst.sheet_number AS dst_sheet_number
    ,CTE_Dst.data_expedient_entry AS dst_data_expedient_entry
    ,CTE_Dst.expedient_address AS dst_expedient_address
FROM
    CTE_Src
    INNER JOIN CTE_Dst ON CTE_Dst.rn = CTE_Src.rn
;

После того, как вы проверили результат этого SELECT и подтвердили, что строки объединены правильно, вы можете UPDATE значения

WITH
CTE_Dst
AS
(
    SELECT
        expedient_id
        ,sheet_number
        ,data_expedient_entry
        ,expedient_address
        ,ROW_NUMBER() OVER (ORDER BY expedient_id) AS rn
    FROM dbo_expedient
)
,CTE_Src
AS
(
    SELECT
        sheet_number
        ,expedient_entry_data
        ,name_expedient_owner
        ,expedient_address
        ,ROW_NUMBER() OVER (ORDER BY YEAR(expedient_entry_data), sheet_number) AS rn
    FROM data_db
)
,CTE_Update
AS
(
    SELECT
         CTE_Src.sheet_number AS src_sheet_number
        ,CTE_Src.expedient_entry_data AS src_expedient_entry_data
        ,CTE_Src.name_expedient_owner AS src_name_expedient_owner
        ,CTE_Src.expedient_address AS src_expedient_address
        ,CTE_Dst.expedient_id AS dst_expedient_id
        ,CTE_Dst.sheet_number AS dst_sheet_number
        ,CTE_Dst.data_expedient_entry AS dst_data_expedient_entry
        ,CTE_Dst.expedient_address AS dst_expedient_address
    FROM
        CTE_Src
        INNER JOIN CTE_Dst ON CTE_Dst.rn = CTE_Src.rn
)
UPDATE CTE_Update
SET dst_sheet_number = src_sheet_number
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...