Как объединить 2 таблицы без общих полей? - PullRequest
0 голосов
/ 18 мая 2019

Есть 2 таблицы:

Таблица 1: имена_символов

id | first_name 
 1 | Joey 
 7 | Ross
 17| Chandler

Таблица 2: фамилии_

id | first_name
 2 | Tribbiani
 7 | Geller 
 25| Bing 

Желаемый результат:

id | full_name
1  | Joey Tribbiani
2  | Ross Geller
3  | Chandler Bing

Задача: Напишите решение, используя только самый простой синтаксис SQL. Использование процедур хранения, объявления переменных, функций ROW_NUMBER(), RANK() запрещено.

У меня есть решение с использованием функции ROW_NUMBER(), но нет идей по решению этой задачи с использованием только простейшего синтаксиса SQL.

PS Я только стажер, и это мой первый вопрос по stackoverflow

Ответы [ 3 ]

2 голосов
/ 18 мая 2019

Простых join здесь будет достаточно

select * from first_names fn
join last_names ln on fn.id = ln.id - 1

Но ваш вопрос очень неясен. Потому что join здесь основано скорее на знаниях о рядах Друзей, а не на конкретной логике ...

1 голос
/ 18 мая 2019

Вы должны создать идентификатор, чтобы присоединиться к таблицам.Это может быть номер заказа в таблице на основе идентификаторов:

select 
  f.counter id, concat(f.first_name, ' ', l.last_name) full_name
from (
  select t.*, (select count(*) from first_names where id < t.id) + 1 counter
  from first_names t
) f inner join (
 select t.*, (select count(*) from last_names where id < t.id) + 1 counter
  from last_names t
) l
on l.counter = f.counter

См. Демоверсию .Результаты:

> id | full_name     
> -: | :-------------
>  1 | Joey Tribbiani
>  2 | Ross Geller   
>  3 | Chandler Bing 
0 голосов
/ 18 мая 2019

Честно говоря, это глупое решение; до 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; и часть ваших проблем будет заключаться в том, чтобы выяснить, что на самом деле представляет собой Х.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...