SQL отображает разные данные из одной и той же таблицы в разных строках - PullRequest
0 голосов
/ 03 ноября 2010

Я пытаюсь получить список систем из нашего программного обеспечения для инвентаризации (в данном случае SCCM) из одного представления (v_gs_softwarefile), но по нескольким критериям. В этом конкретном случае мне нужны все системы (SCCM вызывает уникальный идентификатор «ResourceID», поэтому я просто придерживался этого), которые не имеют версию iexplore> 8, а с другой стороны есть файл saplogon.exe с точной версией 7100.3.13.1045.

Версия 1 (Вопрос: Как вывести имя файла и версию файла saplogon.exe в результате?)

SELECT DISTINCT
    t1.ResourceID
    ,t1.FileName
    ,t1.FileVersion    
FROM
    v_GS_SoftwareFile as t1 
WHERE 
    (t1.filename = 'iexplore.exe'
    and
    t1.fileversion < '8.0')
    and
    t1.resourceid in (
        SELECT DISTINCT
            t2.resourceid
        FROM
            v_gs_softwarefile as t2
        WHERE
            t2.filename = 'saplogon.exe'
            and
            t2.fileversion ='7100.3.13.1045')

Мне удалось получить мой вывод со второй попытки, однако полученный SQL, вероятно, слишком сложен для простого вопроса, с которым я столкнулся в Версии 1

Версия 2:

declare @tab1 table (
    resourceid int,
    filename char(255),
    fileversion char(255)
    )

insert into @tab1(t1.resourceid,t1.filename,t1.fileversion)
select
    t1.resourceid,
    t1.FileName,
    t1.FileVersion    
    from v_GS_SoftwareFile as t1
where 
    t1.filename = 'iexplore.exe'
    and
    t1.fileversion < '8'

select distinct
    temp.resourceid,
    temp.filename as 'IE',
    temp.fileversion as 'IE ver',
    orig.filename as 'SAP',
    orig.fileversion as 'SAP ver'
from @tab1 as temp 
    inner join v_gs_softwarefile as orig on orig.resourceid = temp.resourceid
where
    orig.filename = 'saplogon.exe'
    and
    orig.fileversion = '7100.3.13.1045'
order by temp.resourceid

Результат выглядит так:

resourceid | IE | IE ver | SAP | SAP ver
2542 |iexplore.exe | 6.00.2900.5512 (xpsp.080413-2105) | saplogon.exe | 7100.3.13.1045
1544 |iexplore.exe | 7.00.5730.11 (winmain(wmbla).061017-1135) | saplogon.exe | 7100.3.13.1045

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Или просто сделать самостоятельное соединение ...

select t1.resourceid,
    t1.filename as 'IE',
    t1.fileversion as 'IE ver',
    t2.filename as 'SAP',
    t2.fileversion as 'SAP ver'
from v_GS_SoftwareFile as t1
    inner join v_gs_softwarefile as t2 on t2.resourceid = t1.resourceid
where
    (t2.filename = 'saplogon.exe'
    and
    t2.fileversion = '7100.3.13.1045')
    AND 
    (t1.filename = 'iexplore.exe'
    and t1.fileversion < '8')
order by t1.resourceid
1 голос
/ 03 ноября 2010

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

select distinct temp.resourceid, 
                temp.filename as 'IE', 
                temp.fileversion as 'IE ver', 
                orig.filename as 'SAP', 
                orig.fileversion as 'SAP ver' 
  from (select resourceid,
               FileName,
               FileVersion
          from v_GS_SoftwareFile
          where filename = 'iexplore.exe' and
                fileversion < '8' ) as temp
inner join (select resourceid,
                   filename,
                   fileversion
              from v_gs_softwarefile
              where filename = 'saplogon.exe' and 
                    fileversion = '7100.3.13.1045') as orig
  on orig.resourceid = temp.resourceid
order by temp.resourceid 

Я также подозреваю, что DISTINCT в основном запросе может не понадобиться. Попробуйте это с и без DISTINCT, чтобы увидеть.

Делись и наслаждайся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...