Я хочу создать условное соединение по таблицам.Условное соединение на таблицах
Я уже проверил here. Но я также читал, что OUTER JOIN
может быть не лучшим способом (с точки зрения производительности), так как полное сканирование таблицы все еще происходит? А также, по-видимому, есть разница во мнениях по эффективности использования UNION
.
Каким образом я могу условно присоединиться к таблицам на основе моих требований ниже? пс. Если это требует ваше решение, я могу реализовать это как хранимую процедуру, чтобы создать еще более динамический SQL.
Для всех строк, где userfavorites.objecttype = 100, на основе значения photos.objecttype
Я хочу присоединиться к другой таблице. Если значение objecttype
равно 1, я хочу присоединиться к [locations]
, если значение равно 2 Я хочу присоединиться к [persons]
.
Как выход я хочу следующие столбцы:
photos.title, photos.locpath, (persons.title или locations.title), (persons.friendlyurl или locations.friendlyurl), userfavorites.objectid, userfavorites.objecttype
теперь у меня есть это, чтобы получить строки для одного пользователя:
SELECT * FROM userfavorites uf
INNER JOIN photos vp ON uf.objectid=vp.id
WHERE uf.objecttype=100 AND uf.userid='32DD30EB-1691-457B-9FF5-FC41D687E579'
DDL и вставить операторы:
CREATE TABLE [dbo].[photos](
[id] [int] NOT NULL,
[objectid] [int] NOT NULL,
[locpath] [nvarchar](150) NOT NULL,
[objecttype] [tinyint] NOT NULL,
[title] [nvarchar](50) NULL) ON [PRIMARY]
CREATE TABLE [dbo].[userfavorites](
[id] [int] IDENTITY(1,1) NOT NULL,
[userid] [uniqueidentifier] NOT NULL,
[objectid] [int] NOT NULL,
[objecttype] [tinyint] NOT NULL CONSTRAINT [DF_userfavorites_objecttype] DEFAULT ((0)),
CONSTRAINT [PK_userfavorites] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[persons](
[id] [int] NOT NULL,
[title] [nvarchar](80) NOT NULL,
[friendlyurl] [nvarchar](80) NULL,
CONSTRAINT [PK_persons_1] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE TABLE [dbo].[locations](
[id] [int] NOT NULL,
[title] [nvarchar](80) NOT NULL,
[friendlyurl] [nvarchar](80) NULL,
CONSTRAINT [PK_locations_1] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
USE [tt]
SET IDENTITY_INSERT [dbo].[userfavorites] ON
INSERT [dbo].[userfavorites] ([userid], [objectid], [objecttype]) VALUES (N'32dd30eb-1691-457b-9ff5-fc41d687e579', 41029, 100)
INSERT [dbo].[userfavorites] ([userid], [objectid], [objecttype]) VALUES (N'32dd30eb-1691-457b-9ff5-fc41d687e579', 41030, 100)
INSERT [dbo].[userfavorites] ([userid], [objectid], [objecttype]) VALUES (N'32dd30eb-1691-457b-9ff5-fc41d687e579', 40880, 100)
INSERT [dbo].[userfavorites] ([userid], [objectid], [objecttype]) VALUES (N'32dd30eb-1691-457b-9ff5-fc41d687e579', 40885, 100)
INSERT [dbo].[userfavorites] ([userid], [objectid], [objecttype]) VALUES (N'32dd30eb-1691-457b-9ff5-fc41d687e579', 40882, 100)
INSERT [dbo].[userfavorites] ([userid], [objectid], [objecttype]) VALUES (N'32dd30eb-1691-457b-9ff5-fc41d687e579', 4067, 100)
INSERT [dbo].[userfavorites] ([userid], [objectid], [objecttype]) VALUES (N'BC5EB8A7-FEC2-4932-9C67-AE5A35C4012B', 4067, 100)
SET IDENTITY_INSERT [dbo].[userfavorites] OFF
INSERT [dbo].[photos] ([id], [objectid], [objecttype], [locpath], [title]) VALUES (41029, 1, 1, N'hiltonsky.jpg', N'Overview')
INSERT [dbo].[photos] ([id], [objectid], [objecttype], [locpath], [title]) VALUES (41030, 1, 1, N'pool.jpg', N'Swimming')
INSERT [dbo].[photos] ([id], [objectid], [objecttype], [locpath], [title]) VALUES (40880, 2, 1, N'entrance.jpg', N'Lobby Entrance')
INSERT [dbo].[photos] ([id], [objectid], [objecttype], [locpath], [title]) VALUES (40885, 2, 1, N'room.jpg', N'Room view')
INSERT [dbo].[photos] ([id], [objectid], [objecttype], [locpath], [title]) VALUES (40882, 1, 2, N'zuck.jpg', N'Mark')
INSERT [dbo].[photos] ([id], [objectid], [objecttype], [locpath], [title]) VALUES (4067, 2, 2, N'gates.jpg', N'Bill')
INSERT [dbo].[photos] ([id], [objectid], [objecttype], [locpath], [title]) VALUES (50673, 3, 2, N'musk.jpg', N'Elon')
INSERT [dbo].[locations] ([id], [title], [friendlyurl]) VALUES (1, N'Hilton Hotel', 'hilton-hotel')
INSERT [dbo].[locations] ([id], [title], [friendlyurl]) VALUES (2, N'Marriot Hotel', 'marriot-hotel')
INSERT [dbo].[persons] ([id], [title], [friendlyurl]) VALUES (1, N'Mark Zuckerberg', 'mark-zuckerberg')
INSERT [dbo].[persons] ([id], [title], [friendlyurl]) VALUES (2, N'Bill Gates', 'bill-gates')
INSERT [dbo].[persons] ([id], [title], [friendlyurl]) VALUES (3, N'Elon Musk', 'elon-musk')
Так что для идентификатора пользователя 32dd30eb-1691-457b-9ff5-fc41d687e579
, результат будет:
+----------------+---------------+-----------------+-----------------+----------+------------+
| phototitle | locpath | title | friendlyurl | objectid | objecttype |
+----------------+---------------+-----------------+-----------------+----------+------------+
| Overview | hiltonsky.jpg | Hilton Hotel | hilton-hotel | 1 | 1 |
| Swimming | pool.jpg | Hilton Hotel | hilton-hotel | 1 | 1 |
| Lobby Entrance | entrance.jpg | Marriot Hotel | marriot-hotel | 2 | 1 |
| Room view | room.jpg | Marriot Hotel | marriot-hotel | 2 | 1 |
| Mark | zuck.jpg | Mark Zuckerberg | mark-zuckerberg | 1 | 2 |
| Bill | gates.jpg | Bill Gates | bill-gates | 2 | 2 |
+----------------+---------------+-----------------+-----------------+----------+------------+
Вы должны исправить форматирование вашего запроса, особенно на уровне репутации. Ваш запрос выглядит хорошо для меня, без дополнительной информации. –
@TimBiegeleisen: Благодарим вас за отзыв! Что именно не так с форматированием запроса? Я думал, что я уже обозначил его как блок кода. И как вы могли так быстро форматировать мои желаемые результаты запроса? Спасибо (даже на уровне репутации ... до сих пор учась :) – Flo