在单个结果窗口中获取多个函数调用的结果

时间:2019-02-14 14:47:09

标签: sql sql-server

我希望“主查询”的结果与第一个查询的结果中存在标识符的次数一样多,并且像第二个和第三个结果窗口中那样使它们紧随其后设置。

enter image description here 是否可以通过单个查询获得此结果?

预先感谢您的帮助!

编辑查询的文本版本

ROW_NUMBR()

第一个查询的结果返回多个标识符(int),两个下一个查询的结果始终是,仅填充col1列,然后填充col2列的几行,它描述了一个层次结构

4 个答案:

答案 0 :(得分:1)

我会使用cross apply

select
    case grap.niveau when 0 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col1,
    case grap.niveau when 1 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col2,
    case grap.niveau when 2 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col3,
    pm.SIREN
from (values(23), (25)) t(a)
cross apply GetGrappageParLien531(t.a) grap
join t_personne p on grap.Pers_filiale = p.idpersonne
join t_personne_morale pm on pm.idpersonne = p.idpersonne

答案 1 :(得分:1)

您可以使用第一个查询来创建CURSOR,然后对CURSOR的每次迭代执行“ Main”查询。

答案 2 :(得分:1)

cross apply解决方案可能不是最坏的主意。也许您可以尝试以下方法:

select id_personne_groupe,
        case grap.niveau when 0 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col1,
        case grap.niveau when 1 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col2,
        case grap.niveau when 2 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col3,
        pm.SIREN 
from t_groupe CROSS APPLY
        GetGrappageParLien531(t_group.id_personne_groupe) grap
        join t_personne p on grap.Pers_filiale = p.idpersonne
        join t_personne_morale pm on pm.idpersonne = p.idpersonne
where t_groupe.idgroupe > 0

对于select id_personne_groupe from t_groupe where idgroupe > 0的每个结果,这应该评估“主查询”

答案 3 :(得分:1)

假设您要使用功能id_personne_groupe来遍历GetGrappageParLien531并正确过滤,则可以使用以下光标:

DECLARE @id_personne_groupe INT

DECLARE PersonneGroupeCursor CURSOR FOR
    select id_personne_groupe from t_groupe where idgroupe > 0

OPEN PersonneGroupeCursor
FETCH NEXT FROM PersonneGroupeCursor INTO @id_personne_groupe

WHILE @@FETCH_STATUS = 0
BEGIN

    -- "Main query"
    select
    case grap.niveau when 0 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col1,
    case grap.niveau when 1 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col2,
    case grap.niveau when 2 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col3,
    pm.SIREN
    from GetGrappageParLien531(@id_personne_groupe) grap
    join t_personne p on grap.Pers_filiale = p.idpersonne
    join t_personne_morale pm on pm.idpersonne = p.idpersonne

    select
    case grap.niveau when 0 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col1,
    case grap.niveau when 1 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col2,
    case grap.niveau when 2 Then p.identifiantuniversel + ' - ' + Isnull(pm.SIREN,'(pas de siren)') + ' - ' + pm.raisonsociale else '' end as col3,
    pm.SIREN
    from GetGrappageParLien531(@id_personne_groupe) grap
    join t_personne p on grap.Pers_filiale = p.idpersonne
    join t_personne_morale pm on pm.idpersonne = p.idpersonne

    FETCH NEXT FROM PersonneGroupeCursor INTO @id_personne_groupe

END

CLOSE PersonneGroupeCursor
DEALLOCATE PersonneGroupeCursor