2011-08-12 2 views
4

Это не похоже, что есть разница между:разница между использованием и ПО в Oracle SQL

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 Я могу использовать разные имена столбцов)

+0

Аналогичный вопрос в MySQL http://stackoverflow.com/questions/370268/whats-the-difference-between-using-and-on-in-table-joins/10250985#10250985 – nawfal

ответ

3

Разница для меня является то, что вы можете рисовать себя в угол с ПРИМЕНЕНИЕМ пункта:

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, «столбец часть ИСПОЛЬЗОВАНИЯ положения не может иметь классификатор».

Если удалить 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

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

+0

-1 не соответствует действительности, результаты потенциально совсем другие –

+0

@JeffreyKemp: можете ли вы уточнить? Как эти предложения дают разные результирующие наборы? –

+0

'USING' удаляет дубликаты столбцов, которые были сопоставлены в предложении' USING'. 'ON' не делает. –

5

Не так много. Конечно, ПО позволяет это, что ИСПОЛЬЗОВАНИИ не:

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

Это ANSI синтаксис объединения, это не является уникальным для Oracle.

+0

Ну, Oracle не поддерживает синтаксис ANSI в более старых версиях своей БД. – NullUserException

+1

Правда, до 8i я думаю. Но они проработали около 12 лет! –

+2

Это новая функция от 9i, которой уже 10 лет. Это заставляет меня чувствовать себя таким старым ... – NullUserException

1

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

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

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

Смежные вопросы