SQL - присоединиться с помощью UNION ?? СОЮЗ с помощью JOIN? - PullRequest
7 голосов
/ 06 июля 2011

Мне задавали этот вопрос во время одного из моих интервью.Можете ли вы присоединиться, используя ключевое слово UNION?Можете ли вы сделать UNION, используя ключевое слово JOIN?

То есть - 1. Я должен получить тот же вывод, что и JOIN, не используя ключевое слово JOIN, но используя ключевое слово UNION?2. Я должен получить тот же вывод, что и UNION, не используя ключевое слово UNION, но используя ключевое слово JOIN?

Можете ли вы дать мне пример того, как это сделать, если это возможно?

Ответы [ 4 ]

9 голосов
/ 06 июля 2011

Интервью - это структура, на которой вы излагаете свои товары. Помните: не отвечайте на вопросы;)

Подумайте о пресс-конференции: пресс-секретарь не хочет отвечать на сложные вопросы из журналов, чтобы разобраться в себе. Скорее, они ищут вопросы, на которые у них уже есть ответы, являясь информацией, которую они хотят выпустить (и не более!)

Если бы я столкнулся с этим вопросом в интервью, я бы использовал его, чтобы продемонстрировать свои знания по реляционной алгебре, потому что это то, что я бы взял на собеседование с намерением сделать; Я бдительно отвечаю на вопрос «Поговорим о реляционной алгебре здесь», и это было бы так.

Проще говоря, JOIN является аналогом логического И, тогда как UNION является аналогом логического ИЛИ. Следовательно, похожие вопросы, использующие условную логику, могут быть такими: «Можете ли вы сделать И, используя ИЛИ?» и "Можете ли вы сделать ИЛИ, используя AND?" Ответ будет зависеть от того, что еще вы могли бы использовать, например. НЕ может пригодиться;)

Мне также хотелось бы обсудить различия между набором примитивных операторов, набором операторов, необходимых для вычислительной полноты, и набором операторов и сокращений, необходимых для практических целей.

Попытка ответить на вопрос напрямую поднимает дальнейшие вопросы. JOIN подразумевает «естественное соединение» в реляционной алгебре, тогда как в SQL это подразумевает INNER JOIN. Если вопрос конкретно относится к SQL, нужно ли вам отвечать для всех типов JOIN? А как насчет UNION JOIN?

Чтобы использовать один пример, внешнее объединение SQL - это UNION. Крис Дэйт выражает это лучше, чем я когда-либо мог надеяться:

Наружное соединение специально разработано для производить нули в его результате и должен поэтому следует избегать, в общем. Относительно говоря, это своего рода брак с дробовиком в своего рода союз - да, я имею в виду объединение, а не объединение, даже когда таблицы вопрос не соответствует обычные требования для объединения (см. Глава 6). Это делает это, по сути, заполняя одну или обе таблицы с нулями перед объединением, тем самым заставляя их соответствовать тем обычные требования в конце концов. Но нет никаких причин, почему это дополнение не должно быть сделано с правильными значениями вместо нуля

SQL и теория отношений, 1-е издание, C.J. Date

Это было бы хорошим предметом для обсуждения, если «Я ненавижу нули» - это то, что вы хотели бы донести в интервью!

Это всего лишь несколько мыслей, которые приходят на ум. Важным моментом является то, что, задавая эти вопросы, интервьюер предлагает вам ветку. Что вы будете вешать на это? ;)

9 голосов
/ 06 июля 2011

Поскольку это вопрос собеседования, они проверяют ваше понимание обеих этих функций.

Вероятный ответ, который они ожидают, это "как правило, нет, вы не можете сделать это, поскольку они выполняют разные действия", и вы быобъясните это более подробно, заявив, что объединение добавляет строки в конец набора результатов, где в качестве объединения добавляются дополнительные столбцы.

Единственный способ, которым вы могли бы работать с объединением и объединением, - это когда строки содержат данныетолько из одного из двух источников:

SELECT A.AA, '' AS BB FROM A
UNION ALL 
SELECT '' AS AA, B.BB FROM B

То же, что:

SELECT ISNULL(A.AA, '') AS AA, ISNULL(B.BB, '') AS BB FROM A
FULL OUTER JOIN B ON 1=0

Или сделать это только с одним столбцом, в котором типы совпадают:

SELECT A.AA AS TT FROM A
UNION ALL 
SELECT B.BB AS TT FROM B

То же, что и:

SELECT ISNULL(A.AA, B.AA) AS TT
FROM A
FULL OUTER JOIN B ON 1=0

Один из случаев, когда вы это сделаете, - это если у вас есть данные, порожденные в нескольких таблицах, но вы хотите видеть их все вместе, однако я бы посоветовал использовать UNIONв этом случае вместо FULL OUTER JOIN из-за того, что запрос выполняет то, что вы ожидаете.

1 голос
/ 06 июля 2011

Я думаю, что это также зависит от других доступных операций.

Если я хорошо помню, UNION можно сделать с помощью FULL OUTER соединения:

Table a (x, y)

Table b (x, y) 

CREATE VIEW one
AS
SELECT a.x AS Lx
     , b.x AS Rx
     , a.y AS Ly
     , b.y AS Ry
FROM a FULL OUTER JOIN b
         ON  a.x = b.x
         AND a.y = b.y


CREATE VIEW unionTheHardWay
AS
SELECT COALESCE(Lx, Rx) AS x
     , COALESCE(Ly, Ry) AS y
FROM one
1 голос
/ 06 июля 2011

Вы имеете в виду что-то подобное?

create table Test1 (TextField nvarchar(50), NumField int)
create table Test2 (NumField int)
create table Test3 (TextField nvarchar(50), NumField int)

insert into Test1 values ('test1a', 1)
insert into Test1 values ('test1b', 2)
insert into Test2 values (1)
insert into Test3 values ('test3a', 4)
insert into Test3 values ('test3b', 5)

select Test1.*
from Test1 inner join Test2 on Test1.NumField = Test2.NumField
union
select * from Test3

(написано на SQL Server 2008)

UNION работает, когда оба оператора SELECT имеют одинаковое количество столбцов, И столбцы имеют одинаковые (или, по крайней мере, похожие) типы данных.
UNION не волнует, если оба оператора SELECT выбирают данные только из одной таблицы, или если один или оба из них уже JOIN s для более чем одной таблицы.

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