2010-07-18 5 views
8

Я только что читал об элементах NATURAL JOIN/USING - SQL92, которые (к сожалению?) Отсутствуют в текущем репертуаре SQL Server.SQL Server - отсутствие NATURAL JOIN/x JOIN y USING (поле)

Кто-нибудь пришел из СУБД, которая поддерживала их на SQL Server (или другую несуществующую СУБД) - были ли они полезными, как они звучат, или банкой червей (что также звучит возможно!)?

ответ

15

Я никогда не использую NATURAL JOIN, потому что мне не нравится возможность того, что соединение может сделать что-то, чего я не намерен, потому что в обеих таблицах существует какое-то имя столбца.

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

+0

+1 для прикрепления к синтаксису ON. – Fosco

+0

Я думал по тем же линиям с 'NATURAL JOIN' - было бы лучше, если бы этот тип соединения вместо этого присоединился к некоторому« внешнему ключу »(поскольку это означает, что таблицы« NATURAL JOIN'ing », например, столбцы IsDeleted, были бы бессмысленными). Спасибо, Билл. –

+0

Довольно. Легко добавить столбец в таблицу, чтобы пропустить этот момент и создать условие объединения, когда он не был предназначен (он говорит, сделав именно это в ряде случаев). –

1

Я не вижу значения синтаксиса USING или NATURAL - по мере того как вы столкнулись, последовательно выполняется только ON, поэтому это лучше всего с точки зрения переносимости.

Быть явным также лучше для обслуживания, кроме того, альтернативы могут быть слишком ограниченными для решения ситуаций. Я также предпочел бы, чтобы моя кодовая база была последовательной.

+0

NATURAL JOIN имеет хороший побочный эффект для обеспечения правильных имен столбцов. В противном случае вы закончите с помощью операций соединения, которые вы никогда не планировали. Но если вы правильно назовете свои столбцы, это очень удобный и естественный ярлык. –

2

Связанного SO вопрос: is NATURAL JOIN any better than SELECT FROM WHERE in terms of performance ?

ПРИРОДНЫХ РЕГИСТРИРУЙТЕСЬ не удобный ярлык: это просто опасно. В СУБД это довольно редко.

ИСПОЛЬЗОВАНИЕ ЯВЛЯЕТСЯ явным, но учитывая его ограничения, вы не можете использовать его везде, поэтому ON будет последовательным, нет?

+0

NATURAL JOIN - идеальный ярлык для выполнения чего-то очень естественного (извините за каламбур). Если вы не знаете, как называются столбцы, лучше использовать ИСПОЛЬЗОВАНИЕ, чтобы ограничить операцию соединения явно определенными столбцами. –

8

Считаете ли вы СУБД, которая была действительно реляционная ?:

в Tutorial D [действительно реляционная языка], единственный оператор «присоединиться» является называется JOIN, а это означает, что «естественный присоединиться «... Не должно быть другого типа of join ... Немногие имели опыт использования правильного реляционного языка . Из тех, кто есть, я сильно подозреваю, что ни один из им никогда не жаловался некоторым воспринимаемой неудобства в спаривание столбцов в соответствии с их именами

Источник: «The Importance of Column Names» Хью Дарвен

+0

Хорошая информация. NATURAL JOIN звучит как прекрасная причина объяснить, почему нет чистой RDBMS ... – gbn

1

Это вопрос удобства. Не обязательно, но он должен иметь свое место, например, в интерактивном запросе (каждое нажатие клавиши приближает нас к RSI) или некоторые простые случаи ручного написания SQL даже в производственном коде (да, я это написал. И даже видел JOIN USING в серьезном коде, написанном мудрыми программистами, кроме меня. Но я отвлекаюсь).

Я нашел этот вопрос при поиске подтверждения того, что SS отсутствует эта функция, и я ее получил. Меня только смущает количество ненависти против этого синтаксиса, которое я отношу к синдрому Sour Grapes. Я чувствую себя забавно, когда читаю лекции с покровительственным тоном Сладости (читай: синтаксический сахар) плохо для вашего здоровья. Вы все равно не нуждаетесь в этом.

Что приятно в синтаксисе JOIN USING, является то, что он работает не только на именах столбцов, но и на псевдонимов столбцов, например:

-- foreign key "order".customerId references (customer.id) 
SELECT c.*, c.id as customerId, o.* from customer c 
join "order" o using (customerId); 

Я не согласен с «Присоединиться к использованию будет лучше, если только (...)». Или аргумент, что вам могут потребоваться более сложные условия. С другой точки зрения, зачем использовать JOIN ON? Почему бы не быть чистым и не переместить все условия в статью WHERE?

SELECT t1.*, t2.* from t1, t2 where t2.t1_id = t1.id; 

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

Поэтому вы не должны пропустить этот особый синтаксис слишком дорого, но нечего радоваться за его отсутствие («Фу, это было близко. Так хорошо, что не нужно ПРИСОЕДИНИТЬСЯ ИСПОЛЬЗОВАТЬ. боли ").

Итак, в то время как я лично использую JOIN ON 99% времени, я не чувствую, что нет Schadenfreude, когда нет JOIN USING или NATURAL JOIN.

+0

Пожалуйста, избегайте использования обратных ссылок (как в '' порядке \ ') в коде. Он нарушает стандарт ISO SQL таким же образом [порядок]. Стандарт знает только порядок и «порядок» (разумеется, разумеется). –

+0

Вы правы - я думал, что это адский несовместимость без выкупа, но теперь я вижу, что SQL Server имеет 'QUOTED_IDENTIFIER', а MySQL имеет' ANSI_QUOTES'. См .: http://stackoverflow.com/questions/10573922/what-does-the-sql-standard-say-about-usage-of-backtick –