sql server - «Только одно выражение может быть указано в списке выбора, когда подзапрос не введен с EXISTS». - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть запрос, который вставляет / копирует данные из table2 в table1, кто-нибудь знает, как я могу обойти следующие ошибки.

изначально это был код (пропущен другие столбцы), в результате чего "cannot insert duplicate key in object [TABLE1]", который я обнаружил позже, что ROW_NUMBER получает только одну строку

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

(SELECT RIGHT (REPLICATE('0', 8) + LEFT((SELECT CAST (MAX(Code) AS int), RN = (SELECT ROW_NUMBER() OVER (ORDER BY [TABLE2].[U_PosNo])) FROM [TABLE1]), 8),8)),

сейчас я получаю "Only one expression can be specified in the select list when the sub query is not introduced with EXISTS."


 INSERT INTO [TABLE1] 
  (  
 Code,  
 Name,  
 U_ProdNo,
 ....
'''
 )

 (SELECT 
    (SELECT RIGHT (REPLICATE('0', 8) + LEFT((SELECT CAST (MAX(Code) AS int) + ROW_NUMBER() OVER (ORDER BY [TABLE2].[U_PosNo]) FROM [TABLE1]), 8),8)), 
    (SELECT RIGHT (REPLICATE('0', 30) + LEFT((SELECT CAST (MAX(Name) AS int) + ROW_NUMBER() OVER (ORDER BY [TABLE2].[U_PosNo]) FROM [TABLE1]), 30),30)), 
...
''')

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

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

INSERT Table1 (...)
SELECT 
    RN = (SELECT MAX(CAST(Code AS INT)) FROM Table1) /* Subquery that returns single value */ 
             + ROW_NUMBER() OVER (ORDER BY [U_PosNo]) /* your row number */
        , /*Other columns*/ ....
FROM Table2

Чтобы получить отформатированный код для вашего подхода

SELECT 
    RIGHT(
        REPLICATE('0', 8) 
        + CAST(
            (SELECT MAX(CAST(Code AS INT)) FROM Table1) 
            + ROW_NUMBER() OVER (ORDER BY U_PosNo) 
        AS VARCHAR)
        , 8)
FROM Table2 

Для других подзапросов я рекомендую присоединиться к таблице 3 или применить ее, поскольку вы используете одно и то же условие для всех из них ....

Используйте объединение, если вам нужно вставить одну запись на строку в Таблице3, оставьте, если вы хотите вставить, даже если там нет записей.

SELECT 
    RIGHT(
        REPLICATE('0', 8) 
        + CAST(
            (SELECT MAX(CAST(Code AS INT)) FROM Table1) 
            + ROW_NUMBER() OVER (ORDER BY U_PosNo) 
        AS VARCHAR)
        , 8),
    Table3.LPrice, 
    CASE 
        WHEN [Table2].[MaInC] = 1 THEN [Table2].[MatIdColumn] 
        ELSE [TABLE3].[Column2] END
FROM Table2 
/*LEFT*/ JOIN Table3 ON [TABLE3].[ItemCode] = [Table2].[U_ItmNo]

Если вам нужно использовать только одну совпадающую запись из Таблицы3, скажем, последнюю, используйте APPLY, CROSS, если вы хотите только записи с Таблицей3, OUTER, если вы хотите, чтобы они даже без нее.

SELECT 
    RIGHT(
        REPLICATE('0', 8) 
        + CAST(
            (SELECT MAX(CAST(Code AS INT)) FROM Table1) 
            + ROW_NUMBER() OVER (ORDER BY U_PosNo) 
        AS VARCHAR)
        , 8),
    T3.LPrice, 
    CASE 
        WHEN [Table2].[MaInC] = 1 THEN [Table2].[MatIdColumn] 
        ELSE [T3].[Column2] END
FROM Table2 
CROSS /*OUTER*/ APPLY(
    SELECT TOP 1 * FROM Table3 
    WHERE [TABLE3].[ItemCode] = [Table2].[U_ItmNo]
    ORDER BY DateField DESC
) T3
0 голосов
/ 01 апреля 2019

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

INSERT INTO [TABLE1] 
(  
    Code,  
    Name,  
    U_ProdNo,
    ....
)
SELECT 
    (SELECT RIGHT (REPLICATE('0', 8) + LEFT((SELECT CAST (MAX(Code) AS int) + ROW_NUMBER() OVER (ORDER BY [TABLE2].[U_PosNo]) FROM [TABLE1]), 8),8)), 
    (SELECT RIGHT (REPLICATE('0', 30) + LEFT((SELECT CAST (MAX(Name) AS int) + ROW_NUMBER() OVER (ORDER BY [TABLE2].[U_PosNo]) FROM [TABLE1]), 30),30)), 
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...