É possível recuperar os mesmos dados a seguir com uma única busca ou varredura, modificando a consulta ou influenciando a estratégia do otimizador?
Código e esquema semelhantes a este estão atualmente no SQL Server 2014.
Script de reprodução. Configurar:
USE tempdb;
GO
IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL
DROP TABLE dbo.TestUpload;
CREATE TABLE dbo.TestUpload(
JobRunId bigint NOT NULL,
ThingAName nvarchar(255) NOT NULL,
ThingAType nvarchar(255) NOT NULL,
ThingAGranularity nvarchar(255) NOT NULL,
ThingBName nvarchar(255) NOT NULL,
ThingBType nvarchar(255) NOT NULL,
ThingBGranularity nvarchar(255) NOT NULL
);
CREATE CLUSTERED INDEX IX_JobRunId ON dbo.TestUpload (JobRunId);
GO
INSERT INTO dbo.TestUpload (JobRunId, ThingAName, ThingAType, ThingAGranularity, ThingBName, ThingBType, ThingBGranularity)
VALUES (1, 'A', 'B', 'C', 'D', 'E', 'F');
GO 10
INSERT INTO dbo.TestUpload (JobRunId, ThingAName, ThingAType, ThingAGranularity, ThingBName, ThingBType, ThingBGranularity)
VALUES (1, 'D', 'E', 'F', 'A', 'B', 'C');
GO 10
Consulta:
DECLARE @JobRunID bigint = 1;
SELECT JobRunId,
ThingAName AS Name,
ThingAType AS [Type],
ThingAGranularity AS Granularity
FROM dbo.TestUpload
WHERE JobRunId = @JobRunID
UNION
SELECT JobRunId,
ThingBName AS Name,
ThingBType AS [Type],
ThingBGranularity AS Granularity
FROM dbo.TestUpload
WHERE JobRunId = @JobRunID;
Destruir:
IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL
DROP TABLE dbo.TestUpload;
Eu acho que isso provavelmente não é modelado idealmente. Estou tentando obter mais informações do desenvolvedor sobre como o esquema foi escolhido, mas estou curioso para saber se há um truque TSQL que estou ignorando, pois será mais fácil alterar a consulta do que o esquema.
Eu tentaria isso, mas não tenho ideia se será mais eficiente. Você precisa
DISTINCT
remover duplicatas, portanto,UNION ALL
pode ser mais apropriado, sem necessidade de duas operações distintas:UNION ALL
plano:UNION
plano:Use a aplicação cruzada para transformar colunas em linhas