Разница между USING и ON в Oracle SQL - PullRequest
4 голосов
/ 12 августа 2011

Не похоже, что есть разница между:

SELECT a.col1, b.col2
  FROM table a JOIN table2 b
 USING (col3)

и

SELECT a.col1, b.col2
  FROM table a JOIN table2 b
    ON (a.col3 = b.col3)

Или есть?(конечно, кроме ON я могу использовать разные имена столбцов)

Ответы [ 4 ]

5 голосов
/ 12 августа 2011

Не очень. Конечно, ON разрешает это, что USING не делает:

SELECT a.col1, b.col2
  FROM table a JOIN table2 b
    ON (a.col3 = b.col4)
                      ^

Это синтаксис соединения ANSI, он не уникален для Oracle.

3 голосов
/ 13 августа 2011

Для меня разница в том, что вы можете нарисовать себя в углу с помощью предложения USING:

CREATE TABLE roster (mgrid INTEGER, empid INTEGER);
CREATE TABLE emp (empid INTEGER, NAME VARCHAR2(20));

INSERT INTO roster VALUES (1,10);
INSERT INTO roster VALUES (1,11);
INSERT INTO roster VALUES (1,12);
INSERT INTO roster VALUES (2,20);
INSERT INTO roster VALUES (2,21);

INSERT INTO emp VALUES (10, 'John');
INSERT INTO emp VALUES (11, 'Steve');
INSERT INTO emp VALUES (12, 'Mary');
INSERT INTO emp VALUES (20, 'Ann');
INSERT INTO emp VALUES (21, 'George');
INSERT INTO emp VALUES (1, 'Pete');
INSERT INTO emp VALUES (2, 'Sally');

SELECT r.mgrid, e2.name, e1.empid, e1.name
  FROM roster r JOIN emp e1 USING(empid)
                JOIN emp e2 ON r.mgrid = e2.empid; 

При выборе выше вы получите ora-25154, "часть столбца предложения USING не может иметьквалификатор ".

Если вы удалите квалификатор e1.empid, например:

SELECT r.mgrid, e2.name, empid, e1.name
  FROM roster r JOIN emp e1 USING(empid)
                JOIN emp e2 ON r.mgrid = e2.empid; 

Вы получите ошибку ORA-00918," столбец определен неоднозначно ".

Вы должны использовать:

SELECT r.mgrid, e2.name, e1.empid, e1.name
  FROM roster r JOIN emp e1 ON r.empid = e1.empid
                JOIN emp e2 ON r.mgrid = e2.empid; 

Пример надуманный, но когда я впервые изучал синтаксис объединения, я столкнулся с этой конкретной проблемой в реальной ситуации.С тех пор я избегаю предложения USING.С предложением USING нет никаких преимуществ, кроме нескольких нажатий клавиш.

1 голос
/ 10 декабря 2012

ON включает в себя все столбцы, которые объединяются из объединяемых таблиц, поэтому в результирующем наборе данных имеется два или более одинаковых типов столбцов.

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

USING может быть полезно;) для выполнения вставок с подзапросом, объединяющим таблицы (в моем случае таблицы сглаживания для звездообразной схемы хранилища данных, где мне нужен только один из столбцов id).

0 голосов
/ 12 августа 2011

Нет. Если вы оставите синтаксис позади, в этих двух предложениях нет никакой разницы.

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