Как написать это соединение T_SQL без предложения WHERE? - PullRequest
0 голосов
/ 22 мая 2018

Я застрял, пытаясь написать JOIN, который выдаст набор результатов в соответствии с приведенным ниже примером вывода, но без предложения WHERE, которое я включил, чтобы показать, как должны выглядеть правильные данные.Если предложение WHERE исключено, оно дает неверные результаты.

В таблице #TblA перечислены экземпляры SQL Server на гипотетическом сайте с версией SQL Server и номером сборки, например.'12 .0.5579.0 '

Таблица #TblB представляет собой список всех (в данном примере сокращенных) версий и номеров сборок SQL Server.

Цель состоит в том, чтобы получить набор результатов, в котором перечислены все экземпляры SQL Server, SQLVersion и ProductVersion (Build) вместе с любым ProductVersion (равным пакетам обновлений и накопительным обновлениям), доступным в #TblB, равном * 1009.* выше , чем текущая версия продукта для данной версии экземпляра SQL и версии продукта.

Если вы посмотрите на пример результирующего набора, он должен повторить строки #TblA относительно более высоких строк ProductVersion в #TblB.Между прочим, это позволит сгруппированный отчет в службах Reporting Services.

SET NOCOUNT ON
GO
IF OBJECT_ID('tempdb..#tblA') IS NOT NULL
    DROP TABLE #tblA 

create table #tblA -- build info for specific servers
(
    SQLInstance varchar(128),
    SQLVersion varchar(32),
    ProductVersion varchar(32)
)
GO
INSERT INTO #tblA VALUES ( 'MyServer1', 'SQL Server 2016', '13.0.4001.0' )
INSERT INTO #tblA VALUES ( 'MyServer2', 'SQL Server 2016', '13.0.4001.0' )
INSERT INTO #tblA VALUES ( 'MyServer3', 'SQL Server 2014', '12.0.2000.8' )
INSERT INTO #tblA VALUES ( 'MyServer4', 'SQL Server 2014', '12.0.5000.0' )
INSERT INTO #tblA VALUES ( 'MyServer5', 'SQL Server 2012', '11.0.6020.0' )
INSERT INTO #tblA VALUES ( 'MyServer6', 'SQL Server 2012', '11.0.5058.0' )
GO

IF OBJECT_ID('tempdb..#tblB') IS NOT NULL
    DROP TABLE #tblB 

create table #tblB -- ALL builds available
(
    SQLVersion varchar(32),
    ProductVersion varchar(32)
)

INSERT INTO #tblB VALUES ( 'SQL Server 2017', '14.0.3025.34' )
INSERT INTO #tblB VALUES ( 'SQL Server 2017', '14.0.3023.8' )
INSERT INTO #tblB VALUES ( 'SQL Server 2017', '14.0.3022.28' )
INSERT INTO #tblB VALUES ( 'SQL Server 2017', '14.0.3015.40' )
INSERT INTO #tblB VALUES ( 'SQL Server 2017', '14.0.3008.27' )
INSERT INTO #tblB VALUES ( 'SQL Server 2017', '14.0.3006.16' )

INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.5026.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4474.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4466.4' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4457.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4451.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4446.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4435.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4422.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4411.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2016', '13.0.4001.0' )

INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5579.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5571.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5557.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5556.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5553.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5546.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5540.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5538.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5522.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5511.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.5000.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.4522.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.4511.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2014', '12.0.2000.8' )

INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.7001.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6607.3' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6598.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6594.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6579.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6567.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6544.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6540.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6537.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6523.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6518.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.6020.0' )
INSERT INTO #tblB VALUES ( 'SQL Server 2012', '11.0.5678.0' )

И запрос:

-- The following gives a correct dataset in the format required for grouped reporting but ONLY because of the WHERE clause
-- Want a neat query that will produce the same format for all versions without the WHERE clause 
SELECT
    a.*,
    b.*
FROM
     #tblB b
     left join  #tblA a
     ON  b.ProductVersion > a.ProductVersion 
     AND a.SQLVersion = b.SQLVersion
WHERE
    a.SQLVersion = 'SQL Server 2014'

Вывод: -

**SQLInstance   SQLVersion  ProductVersion  SQLVersion  ProductVersion**
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5579.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5571.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5557.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5556.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5553.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5546.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5540.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5538.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5522.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5511.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.5000.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.4522.0
MyServer3   SQL Server 2014 12.0.2000.8 SQL Server 2014 12.0.4511.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5579.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5571.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5557.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5556.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5553.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5546.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5540.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5538.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5522.0
MyServer4   SQL Server 2014 12.0.5000.0 SQL Server 2014 12.0.5511.0

1 Ответ

0 голосов
/ 22 мая 2018

Это то, что вы хотите?

SELECT a.*, b.*
FROM #tblB b JOIN
      #tblA a
      ON b.ProductVersion > a.ProductVersion AND
         a.SQLVersion = b.SQLVersion
ORDER BY a.SQLVersion;

Я не могу понять, почему вы хотели бы получить LEFT JOIN в конечном запросе.Ваша версия фактически является INNER JOIN из-за предложения WHERE.

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