Error al obtener различный resultados de una subconsulta - SQL

Quiero hacer una select, подставьте 3 columnas, la primera es un id, la segunda es un nombre, y la tercera otro nombre.

Финал El objetivo es obtener en una tabla танго que ya montada, uno una columna que contenga алгоритм u otro nombre en función de si tienen o никакой параграф ese идентификатор definido.

Pseudocódigo:

select id, 
if(nombre1 is not null) entonces obtengo nombre1
else if (nombre2 is not null) entonces obtengo nombre2
else ''

Он visto ejemplos подставляет condiciones CASE WHEN y довод "против" EXISTS, pero никакой doy подставляют ello. Краткая информация El nombre lo obtengo подставляет esta consulta:

select [AM].[idAM], (select top 1 Responsable) GestorAM from [RegModifNRAM]
        inner join [AM] 
        on [AM].[idAM] = [RegModifNRAM].[idAM]
        inner join [AccionesRegModifCulture] 
        on AccionesRegModifCulture.idAccionesRegModif = [RegModifNRAM].[idAccion] and AccionesRegModifCulture.idCulture = 1
        INNER JOIN  Auditoria 
        ON [RegModifNRAM].idAuditoria = Auditoria.idAuditoria
        where [RegModifNRAM].[idAccion] in (50000,50023,50024,50026,50028,50030,50031,50036,50038,50039,50041,50044)
        order by [RegModifNRAM].[fx_Creacion] desc

... y Эль-Сегундо nombre así:

    Select am.idam, 
( SELECT TOP 1  LTRIM(RTRIM(ISNULL(dbo.Responsable.apellido1, '') 
                                + ' ' 
                                + ISNULL(dbo.Responsable.apellido2, '') 
                                + ' ' 
                                + ISNULL(dbo.Responsable.nombre, '')))
  FROM  ResponsableAMPrivilegio
                LEFT JOIN Responsable
                    ON Responsable.idResponsable = ResponsableAMPrivilegio.idResponsable
                WHERE   (ResponsableAMPrivilegio.borrado = 0 OR ResponsableAMPrivilegio.borrado IS NULL)
                        AND ResponsableAMPrivilegio.idPrivilegio =  40 --P40    GESTOR SAM
                        and am.idam = ResponsableAMPrivilegio.idaccionmejora
                        AND ResponsableAMPrivilegio.idAccionMejora in (SELECT ID FROM #IDSENTIDADESeq)
) as 'GestorAM'
from AM
WHERE AM.idAM in (SELECT ID FROM #IDSENTIDADESeq)

Veo si puedo obtener un nombre en la primera consulta, СИ никакой puedo, veo en la segunda, pero СИ не, dejo ''.

Он estado mirando subconsultas dentro de condiciones CASE, y dentro de IF..ELSE параграф intentar obtenerlo, pero никакой lo consigo.

Pongo el ejemplo de las dos tablas y de lo que quiero conseguir:

Таблица Primera:

idAM    Responsable 
5982    RAUL CORBELLA CARRASCO
6854    PEDRO JIMÉNEZ MARTÍN
8555    NULL
8556    NULL

Таблица Segunda:

idAM    Responsable 
5982    NULL
6854    PEDRO JIMÉNEZ MARTÍN
8555    MARTÍN CEBALLOS
8556    NULL

Форма De esta, финал el resultado en la tabla sería алгоритм así:

idAM    Columna1    ...    ...   Responsable              ...    ...    
5982    ...                      RAUL CORBELLA CARRASCO
6854    ...                      PEDRO JIMÉNEZ MARTÍN
8555    ...                      MARTÍN CEBALLOS
8556    ...                      NULL
1
задан 29.11.2016, 15:12
3 ответа

Ответ автора вопроса, который он предоставлял в редактировании в первоначальный вопрос.

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

У меня есть 2 querys, в которых я должен доставать из конкретной таблицы стоимость для каждой, и потом подтверждать, есть ли у первой стоимость. В случае когда у него было стоимости, я оставляю себе вторую. Мое решение (я не знаю, более или менее оптимальная, но да функциональный) состоял ли он в том, чтобы использовать временные подмостки. Я создал временную таблицу, чтобы хранить результат первого query, и другую временную таблицу, чтобы хранить результат второй. Потом, в третьей таблице, я использую функцию ISNULL (valorTabla1, valorTabla2), чтобы подтверждать результат двух предыдущих подмостков, оставаясь следующего способа:

Я верю в мою временную главную таблицу, где я буду хранить результат проверки:

CREATE TABLE #TABLA_CARGADOR_INFORMESMA (idInformeSMA INT, Cargador varchar(4000))

Я получаю стоимость первого query в первой временной таблице:

select [InformeSMA].idInformeSMA, [RegModifNRSMA].Responsable CargadorInformeSMA--,
into #TABLA_CARGADOR_INFORMESMA_LOG
    from [InformeSMA]
        left join [RegModifNRSMA] 
        on [InformeSMA].[idInformeSMA] = [RegModifNRSMA].[idSMA] and [RegModifNRSMA].[idAccion] in (20000)--,20005,20013,20014,20015,20016,30000)
        left join [AccionesRegModifCulture] 
        on AccionesRegModifCulture.idAccionesRegModif = [RegModifNRSMA].[idAccion] and AccionesRegModifCulture.idCulture = 1
        left JOIN   Auditoria 
        ON [RegModifNRSMA].idAuditoria = Auditoria.idAuditoria
        where [InformeSMA].[idInformeSMA] 
        in (SELECT ID FROM #IDSENTIDADESeq)

Я получаю стоимость второго query во второй временной таблице:

 select InformeSMA.idInformeSMA,
(SELECT TOP 1   CASE WHEN Responsable.apellido2 like '%Delegado por%' OR Responsable.apellido2 like '%Simulado por%'

      THEN LTRIM(RTRIM(ISNULL(dbo.Responsable.apellido1, '') +
                                ' ' 
                                + ISNULL(dbo.Responsable.apellido2, '') +
                                ' ' 
                                + ISNULL(dbo.Responsable.nombre, '')))
      ELSE LTRIM(RTRIM(ISNULL(dbo.Responsable.nombre, '') +
                                ' ' 
                                + ISNULL(dbo.Responsable.apellido1, '') +
                                ' ' 
                                + ISNULL(dbo.Responsable.apellido2, '')))
END
                FROM    ResponsableAuditoriaPrivilegio
                LEFT JOIN Responsable ON Responsable.idResponsable = ResponsableAuditoriaPrivilegio.idResponsable
                WHERE   ResponsableAuditoriaPrivilegio.idAuditoriaGama = InformeSMA.idInformeSMA
                        AND 
                        (ResponsableAuditoriaPrivilegio.borrado = 0 OR ResponsableAuditoriaPrivilegio.borrado IS NULL)
                        AND ResponsableAuditoriaPrivilegio.idPrivilegio = 26 --P26 - GESTOR INFORME SMA
                        ) as 'cargadorInforme'

into #TABLA_CARGADOR_INFORMESMA_PRIVILEGIO
from InformeSMA
WHERE InformeSMA.idInformeSMA
 in (SELECT ID FROM #IDSENTIDADESeq)

Я использую главную таблицу, чтобы получать результат, желаемый с функцией ISNULL ():

    INSERT INTO #TABLA_CARGADOR_INFORMESMA
    select distinct #TABLA_CARGADOR_INFORMESMA_LOG.idInformeSMA,            isnull(#TABLA_CARGADOR_INFORMESMA_LOG.CargadorInformeSMA,   #TABLA_CARGADOR_INFORMESMA_PRIVILEGIO.cargadorInforme)
from #TABLA_CARGADOR_INFORMESMA_PRIVILEGIO
inner join #TABLA_CARGADOR_INFORMESMA_LOG on #TABLA_CARGADOR_INFORMESMA_LOG.idInformeSMA = #TABLA_CARGADOR_INFORMESMA_PRIVILEGIO.idInformeSMA
where #TABLA_CARGADOR_INFORMESMA_LOG.idInformeSMA 
in (SELECT ID FROM #IDSENTIDADESeq)

Чтобы заканчиваться, если я делаю select * из временной главной таблицы, я получаю ожидаемый результат. Хотя не будем поняты, что делает каждый из querys, я надеюсь, что понятна процедура, которую я продолжил, чтобы получать мое решение, и что смог помогать людям.

1
ответ дан 24.11.2019, 12:23

Ты не нуждаешься ни для чего в том, чтобы сделать субконсультацию в этом случае, простом JOIN он больше, чем достаточный:

SELECT A.idAM, ISNULL(A.Responsable,B.Responsable) Responsable
FROM dbo.Tabla1 A
LEFT JOIN dbo.Tabla2 B
    ON A.idAM = B.idAM;
1
ответ дан 24.11.2019, 12:23
  • 1
    Я понимаю, что, таким образом, если первая консультация недействительная, он идет во вторую, и если é sta она недействительная, как говорит Garrizano, я могу помещать ' ' и что вышел vací или и точка. Проблема, которая у меня есть, состоит в том, что я должен доставать это в funció n стоимости других полей этой таблицы. Например: select A.idAM, ISNULL (A.Responsable from dbo. TABLA1 В where В campo1 = X and В campo2 = И, B.Responsable from dbo. TABLA2 B where B.campo1 = J and B.campo2 = K) Не sé если я объясняюсь. Desconocí в эту funció n is null, и не sé если я могу брать эту стоимость A.Responsable помещая эти условия, чтобы это получать. –  daniel lozano 28.11.2016, 10:43
  • 2
    Какой-то формы, поместив стоимость, которую я хочу получить в ISNULL (.), не sé если я могу помещать эти условия, что у меня есть постановка для каждой из двух стоимости, или могу приспосабливать ее какой-то формы, чтобы помещать ее внутри ISNULL. Большое спасибо из-за твоего ответа! –  daniel lozano 28.11.2016, 10:49

Я не уверен понимания того, что ты хочешь сделать, но он думал бы о чем-то с ISNULL(expresion_a_evaluar, valor_de_reemplazo). В первом параметре это могла бы быть она первый sub консультация и второй параметр твоя секунда sub консультируется. И я думаю, что их было бы двумя ISNULL укрытые:

SELECT
    ID,
    ISNULL(
        ISNULL(TU_PRIMER_SUB_CONSULTA, TU_SEGUNDA_SUB_CONSULTA), '') as RESPONSABLE
FROM
    TABLA_DE_DONDE_OBTIENES_EL_ID

Это моя идея, если он что я понял тебя хорошо.

Привет.

0
ответ дан 24.11.2019, 12:23
  • 1
    Sí! Справедливая эта идея, только который, как я говорю справедливому Lamak наверху, эту стоимость первой консультации и вторую я не получаю прямо, но я получаю их в funció n условий, которые я помещаю в where в этих select, которые я поместил наверху. У тебя идея есть, если я могу приспосабливать их для того, чтобы они имелись в виду, сделав ISNULL? Большое спасибо из-за твоего ответа! –  daniel lozano 28.11.2016, 10:51
  • 2
    Я говорю, что ты поместил эти две консультации внутри ISNULL, así ты завершаешь. –  Garrizano 28.11.2016, 15:49
  • 3
    Я это попробовал, но он дал мне ошибку из-за всех сторон. Я пытаюсь он состоит в том, чтобы создавать два временных подмостков, которые содержали бы стоимость и третью одну, которую использовал бы этот {ISNULL} подтверждая, есть ли стоимость в первой временной таблице и, если нет, что пошел во вторую. Которое intenté с консультациями fué делать немного тип: { SELECT idAM, (consulta1), (consulta2) }, но он давал мне ошибки bound тип и вещи así. ¿ Только помещать с это в консультацию как я говорю serí в достаточный, или скорее всего я препятствую чему-то, сделав это? Я не знаю, если я могу помещать полную консультацию с Вашим joins, и совсем. извините неопытность = ( –  daniel lozano 28.11.2016, 17:28
  • 4
    Sí ты можешь размещать всю консультацию внутри, только будь осторожен размещения этого по порядку. Поскольку это sub консультации, эти должны внутри paré ntesis: ISNULL((SUB_CONSULTA_1), (SUB_CONSULTA_2)). Не беспокойся, с опытом он один изучает понемногу; все cuestió n доказательства и ошибки :-) –  Garrizano 28.11.2016, 18:17
  • 5
    Большое спасибо Garrizano!, ваша помощь пришла ко мне супер добро. Я помещаю вас cuá l был solució n, который я нашел, и что я функционировал правильно. Я это помещаю в консультацию mí в с этикеткой SOLUCIÓ N. –  daniel lozano 29.11.2016, 13:20

Теги

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