Apakah mungkin untuk mengambil data yang sama dengan yang berikut dengan pencarian tunggal atau pemindaian, baik dengan memodifikasi kueri atau memengaruhi strategi pengoptimal?
Kode dan skema yang mirip dengan ini saat ini ada di SQL Server 2014.
Skrip repro. Mendirikan:
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
Pertanyaan:
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;
Robek:
IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL
DROP TABLE dbo.TestUpload;
Saya pikir ini mungkin tidak dimodelkan secara ideal. Saya mencoba untuk mendapatkan lebih banyak informasi dari pengembang tentang bagaimana skema dipilih tetapi saya ingin tahu apakah ada trik TSQL yang saya hadapi karena akan lebih mudah untuk mengubah kueri daripada skema.
sumber
UNION
tidak ada duplikat yang harus dihapus.DISTINCT
wajib. Lihat data James. Ada pertengkaran denganA,B,C,-,-,-
dan lain dengan-,-,-,A,B,C
. Baris yang dihasilkan satu dari data A dan yang lainnya dari data B adalah identik dan harus dihapus. Bahkan jikaUNION ALL
diganti denganUNION
, ini tidak dapat dihindari. (dan dengan "ini" saya tidak bermaksud "sort", maksud saya operasi "berbeda". Ini mungkin dilakukan dengan sortir atau hash, metode apa pun yang dapat dan dipilih oleh pengoptimal.)