Скажем, у меня есть три таблицы A, B и C. Каждый из них имеет два столбца: первичный ключ и некоторый другой фрагмент данных. Каждый из них имеет одинаковое количество строк. Если я JOIN
A и B на первичном ключе, я должен получить то же количество строк, что и в любом из них (в отличие от A.rows * B.rows).
Теперь, если я JOIN
A JOIN B
с C
, почему я получаю дубликаты строк? Я несколько раз сталкивался с этой проблемой, и я не понимаю ее. Похоже, что он должен давать тот же результат, что и JOIN
ing A
и B
, поскольку он имеет такое же количество строк, но вместо этого создаются дубликаты.
Запросы, которые дают такие результаты, относятся к формату
SELECT *
FROM M
INNER JOIN S
on M.mIndex = S.mIndex
INNER JOIN D
ON M.platformId LIKE '%' + D.version + '%'
INNER JOIN H
ON D.Name = H.Name
AND D.revision = H.revision
Вот схемы для таблиц. H содержит историческую таблицу, содержащую все, что было когда-либо в D. Существует множество M строк для каждого D и одного S для каждого M.
Таблица M
[mIndex] [int] NOT NULL PRIMARY KEY,
[platformId] [nvarchar](256) NULL,
[ip] [nvarchar](64) NULL,
[complete] [bit] NOT NULL,
[date] [datetime] NOT NULL,
[DeployId] [int] NOT NULL PRIMARY KEY REFERENCES D.DeployId,
[source] [nvarchar](64) NOT NULL PRIMARY KEY
Таблица S
[order] [int] NOT NULL PRIMARY KEY,
[name] [nvarchar](64) NOT NULL,
[parameters] [nvarchar](256) NOT NULL,
[Finished] [bit] NOT NULL,
[mIndex] [int] NOT NULL PRIMARY KEY,
[mDeployId] [int] NOT NULL PRIMARY KEY,
[Date] [datetime] NULL,
[status] [nvarchar](10) NULL,
[output] [nvarchar](max) NULL,
[config] [nvarchar](64) NOT NULL PRIMARY KEY
Таблица D
[Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[branch] [nvarchar](64) NOT NULL,
[revision] [int] NOT NULL,
[version] [nvarchar](64) NOT NULL,
[path] [nvarchar](256) NOT NULL
Таблица H
[IdDeploy] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](64) NOT NULL,
[version] [nvarchar](64) NOT NULL,
[path] [nvarchar](max) NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NULL,
[Revision] [nvarchar](64) NULL,
Я не публиковал таблицы и запрос изначально, потому что меня больше интересует понимание этой проблемы для себя и избежания ее в будущем.