Честно говоря, это глупое решение; до ROW_NUMBER
это крайне неэффективно, и я не удивлюсь, если LEAD
«не разрешено», а ROW_NUMBER
- нет. Тот факт, что вам сказали «использовать самый простой SQL», означает, что SQL, который вы хотите использовать, это подзапрос / CTE и ROW_NUMBER
; это настолько просто, насколько это действительно возможно. Все остальное добавит слой на ненужную сложность и, скорее всего, приведет к снижению производительности в запросе. Этот, например, означает, что вам нужно сканировать обе таблицы дважды; где, как с ROW_NUMBER
, это будет один раз.
CREATE TABLE FirstNames (id int, FirstName varchar(10));
CREATE TABLE LastNames (id int, LastName varchar(10));
INSERT INTO FirstNames
VALUES(1,'Joey'),
(7,'Ross'),
(17,'Chandler');
INSERT INTO LastNames
VALUES (2,'Tribbiani'),
(7,'Geller'),
(25,'Bing');
GO
WITH CTE AS(
SELECT FN.id,
FN.FirstName,
LN.LastName
FROM FirstNames FN
LEFT JOIN LastNames LN ON FN.id = LN.id
UNION ALL
SELECT LN.id,
FN.FirstName,
LN.LastName
FROM LastNames LN
LEFT JOIN FirstNames FN ON LN.id = FN.id
WHERE FN.id IS NULL),
FullNames AS(
SELECT C.id,
C.FirstName,
ISNULL(C.LastName, LEAD(C.LastName) OVER (ORDER BY id)) AS LastName
FROM CTE C)
SELECT *
FROM FullNames FN
WHERE FN.FirstName IS NOT NULL
ORDER BY FN.id;
GO
DROP TABLE FirstNames;
DROP TABLE LastNames;
Для ответа на «задание» дано:
«Задача: написать решение, используя только самый простой синтаксис SQL. Использование процедур хранения, объявления переменных, функций ROW_NUMBER (), RANK () запрещено.»
Мой ответ будет ниже?
"Почему это требование? SQL Server поддерживает ROW_NUMBER
в течение 14 лет, начиная с SQL Server 2005. Если вы не можете использовать ROW_NUMBER
, это означает, что вы используете SQL Server 2000. Это на самом деле это большая проблема безопасности для компании, поскольку 2000 год уже почти десять лет не поддерживается. Законодательство, такое как GDPR, требует, чтобы компания обеспечивала безопасность используемых ими технологий, и поэтому маловероятно, что это будет выполнено.
Если это так, то решение, если не найти, можно обойти, используя ROW_NUMBER
, но чтобы вернуть компанию в прежнее состояние. Последняя версия SQL Server, которую вы можете обновить с SQL Server 2000, - 2008; которая также заканчивается 16 июля этого года. Нам нужно будет запустить экземпляр и запустить существующие функции на этом новом сервере как можно скорее и выполнить тестирование качества как можно скорее. Это должно быть наивысшим приоритетом. После этого нам нужно повторить цикл для другой версии SQL Server. Последняя версия 2017 года, которая поддерживает миграцию с 2008 года.
Как только мы это сделаем, мы сможем использовать ROW_NUMBER
в запросе; предоставляя простейшее решение, а также возвращая компанию в безопасную среду. "
Иногда требования должны быть оспорены. Из опыта управления можно сделать несколько «глупых» требований, потому что они не разбираются в технологиях. Когда вы находитесь в роли ИТ, иногда вам нужно подвергать сомнению эти требования и объяснять, почему требование на самом деле не является хорошей идеей. Затем вы можете помочь руководству найти правильное решение проблемы. В конце концов, то, что они могут пытаться исправить, может быть проблемой XY; и часть ваших проблем будет заключаться в том, чтобы выяснить, что на самом деле представляет собой Х.