Я видел несколько ответов на тему «Несколько таблиц в FROM vs INNER JOIN», и все они, кажется, говорят, что нет разницы в производительности, но INNER JOIN более новый, более читаемый и предпочтительный.
Моя проблема в том, что в моем конкретном случае использование INNER JOIN кажется более трудным для чтения.
Вот таблицы, которые я буду использовать позже:
CREATE TABLE [dbo].[Entity]
(
[EntityId] int CONSTRAINT [PK_EnityId] PRIMARY KEY NOT NULL IDENTITY(1,1)
);
GO;
CREATE TABLE [dbo].[Table1]
(
[Table1Id] int CONSTRAINT [PK_Table1Id] PRIMARY KEY NOT NULL IDENTITY(1,1),
[EntityId] int CONSTRAINT [FK_Table1_EntityId] FOREIGN KEY REFERENCES [dbo].[Entity]([EntityId]) NOT NULL,
[Col1] int,
[Col2] int
);
GO;
CREATE TABLE [dbo].[Table2]
(
[Table2Id] int CONSTRAINT [PK_Table2Id] PRIMARY KEY NOT NULL IDENTITY(1,1),
[EntityId] int CONSTRAINT [FK_Table2_EntityId] FOREIGN KEY REFERENCES [dbo].[Entity]([EntityId]) NOT NULL,
[Col3] int
);
GO;
CREATE TABLE [dbo].[Table3]
(
[Table3Id] int CONSTRAINT [PK_Table3Id] PRIMARY KEY NOT NULL IDENTITY(1,1),
[EntityId] int CONSTRAINT [FK_Table3_EntityId] FOREIGN KEY REFERENCES [dbo].[Entity]([EntityId]) NOT NULL,
[Col4] int
);
У меня есть хранимая процедура, которая:
- имеет входной параметр
@id
(что являетсяEntityId
) - возвращает одну запись, где поля взяты из разных таблиц
- Мой подход с несколькими таблицами в предложении FROM:
CREATE PROCEDURE [dbo].[GetDataFromMultipleTables]
@id int
AS
SELECT [dbo].[Table1].[Col1], [dbo].[Table1].[Col2], [dbo].[Table2].[Col3], [dbo].[Table3].[Col4]
FROM [dbo].[Table1], [dbo].[Table2], [dbo].[Table3]
WHERE [dbo].[Table1].[EntityId] = @id AND [dbo].[Table2].[EntityId] = @id AND [dbo].[Table3].[EntityId] = @id;
RETURN 0
- Подход INNER JOIN №1:
CREATE PROCEDURE [dbo].[GetDataFromMultipleTables]
@id int
AS
SELECT [dbo].[Table1].[Col1], [dbo].[Table1].[Col2], [dbo].[Table2].[Col3], [dbo].[Table3].[Col4]
FROM [dbo].[Table1],
INNER JOIN [dbo].[Table2] ON [dbo].[Table1].[EntityId] = [dbo].[Table2].[EntityId]
INNER JOIN [dbo].[Table3] ON [dbo].[Table1].[EntityId] = [EntityId].[Table3].[EntityId]
WHERE [dbo].[Table1].[EntityId] = @id;
RETURN 0
- Подход INNER JOIN # 2:
CREATE PROCEDURE [dbo].[GetDataFromMultipleTables]
@id int
AS
SELECT [dbo].[Table1].[Col1], [dbo].[Table1].[Col2], [dbo].[Table2].[Col3], [dbo].[Table3].[Col4]
FROM [dbo].[Table1],
INNER JOIN [dbo].[Table2] ON [dbo].[Table2].[EntityId] = @id
INNER JOIN [dbo].[Table3] ON [dbo].[Table3].[EntityId] = @id
WHERE [dbo].[Table1].[EntityId] = @id;
RETURN 0
Я удалил подход 4: неверный синтаксис
Мне не нравятся подходы 2 и 3, потому что Table1
так же важно, как Table2
а также Table3
, поэтому он не заслуживает другого синтаксиса. Также мне не нравится, что условие для Table1
после JOINs.
Вариант №1 мне больше нравится, потому что все таблицы обрабатываются одинаково.
Кроме того, я думаю, что INNER JOIN не следует использовать, как в подходе 3.
В этом конкретном случае:
- имеет ли смысл реализация с INNER JOIN?
- лучше ли следовать подходу 1?
- Есть ли какие-то другие варианты или подходы, которые мне не хватает, и я должен их рассмотреть?