Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 В какой СУБД есть "расш. запрос на объединение"  [new]
Blob
Member

Откуда: Украина, Харьков
Сообщений: 237
В книжке Джеймс Грофф, Поль Вайнберг "SQL. Полное руководство". Изд-во BHV, 1999 г. описана инструкция ANSI/ISO SQL92 "расширенный запрос не объединение":
SELECT * FROM Table1 UNION JOIN Table2
Допустим если
declare @table1 Table(St1 char(1))
	INSERT @table1(St1) SELECT 'A' UNION SELECT 'B' UNION SELECT 'C'
declare @table2 Table(St1 int)
	INSERT @table2(St1) SELECT 1 UNION SELECT 2 UNION SELECT 3
То
SELECT * FROM @table1 UNION JOIN @table2
должно выдавать вот это:

St1 St1
___________________________
A NULL
B NULL
C NULL
NULL 1
NULL 2
NULL 3
___________________________
А какая СУБД поддерживает эту инструкцию? MS SQL насколько я понял нет. А может я неправильно законспектировал синтаксис?
29 окт 04, 18:02    [1072295]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
А чем он отличается от
declare @table1 Table(St1 char(1))
	INSERT @table1(St1) SELECT 'A' UNION SELECT 'B' UNION SELECT 'C'
declare @table2 Table(St1 int)
	INSERT @table2(St1) SELECT 1 UNION SELECT 2 UNION SELECT 3

select st1 tab1_str1,null tab1_str2 from @table1
UNION
select null tab1_str1,st1 tab1_str2 from @table2
?
29 окт 04, 18:38    [1072373]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Dedushka Mazai
Member

Откуда:
Сообщений: 959
а смысл-то какой в этой конструкции?
29 окт 04, 18:42    [1072378]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Blob
Member

Откуда: Украина, Харьков
Сообщений: 237
Dedushka Mazai
а смысл-то какой в этой конструкции?

Узнаю какой - напишу. Смысл постигается в процессе применения конструкций. Вот например в аксессе нет FULL OUTER JOIN - а он очень удобен, например когда есть вот такие таблицы:
create table classes (
class nvarchar(32) NOT NULL PRIMARY KEY,
type nvarchar(32) NULL,
country nvarchar(32) NULL,
numGuns tinyint NULL,
bore real NULL,
displacement int NULL)
GO
create table Ships (
name nvarchar (32) NOT NULL PRIMARY KEY,
class nvarchar(32) NULL FOREIGN KEY REFERENCES classes,
launched smallint NULL)
GO
create table Outcomes (
ship nvarchar(32) NOT NULL,
battle nvarchar (32) NOT NULL,
result nvarchar(32) NULL,
CONSTRAINT PK__Outcomes PRIMARY KEY(ship,battle))
- и при этом существует как бы неявный внешний ключ Outcomes.ship FOREIGN KEY REFERENCES classes. Т.е. не все корабли из Outcomes есть в Ships, но если имя корабля Outcomes.Ship совпадает с именем класса из classes, это корабль этого класса. Подробнее про эту базу почитай на www.sql-ex.ru.
Я хочу сказать, что чтобы найти все корабли, для которых известны их классы, мне удобно сделать так:
SELECT * FROM Outcomes FULL OUTER JOIN Ships ON 
			Outcomes.Ship = Ships.Name RIGHT OUTER JOIN Classes ON 
			Outcomes.Ship = Classes.Class OR Ships.Class = Classes.Class
29 окт 04, 19:48    [1072494]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
зачем нужен full outer я думаю и так ясно :)
29 окт 04, 20:30    [1072544]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Alexey Kudinov
Member

Откуда:
Сообщений: 14583
MSSQL
declare @table1 Table(St1 char(1))

INSERT @table1(St1) SELECT 'A' UNION SELECT 'B' UNION SELECT 'C'

declare @table2 Table(St1 int)

INSERT @table2(St1) SELECT 1 UNION SELECT 2 UNION SELECT 3

SELECT * FROM @table1 T1
	FULL JOIN @table2 T2
		ON T1.st1 = CAST(T2.st1 AS CHAR)
?
29 окт 04, 21:02    [1072570]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145754
Dedushka Mazai. То, что в Вашей книжке написано, на сегодняшний день является брехней. Расматривается устаревший синтексис. Правильный синтаксис по стандарту SQL-2 - FULL OUTER JOIN, как и ответил funikovyuri. И этот синтаксис MS SQL подерживает (Acccess тоже поддерживает). Возможно, в 1992 году, когда была написана книжка, и не поддерживал.

Кстати, этот вид объединения мне на практике довелось использовать только один раз.

А ваш запрос, на самом деле должен выглядеть так.

Причем, я предполагаю, что Вас интересуют только корабли из таблы Outcomes.
Кстати, не надо надеятся на имя корабля, как на ключевое поле. Имя может менятся. Лучше использовать суррогатный ключ. И уж во всяком случае, надо использовать одинаковые названия полей. Шип, так Шип, Нэйм, так Нэйм. Но одинаково во всех таблицах!

Ваш запрос (если Вы правильно сформулировали то, что Вам нужно)

Select * from Outcomes as O
join Ships as S on S.name=O.Ship
join classes as C on C.class=S.class

===============
на самом деле, Вам нужно было задать свой вопрос в форуме по соответсвующему серверу.
29 окт 04, 21:17    [1072582]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
ChA
Member

Откуда: Москва
Сообщений: 11383
Cat2
Dedushka Mazai. То, что в Вашей книжке написано
Может я что-то не понял, но где он упоминал какую-либо книжку ? Напраслиной отдает...
Cat2
на сегодняшний день является брехней. Расматривается устаревший синтексис.
Вы про пример из первого поста Blob ? А почему брехня и устаревший ?
автор
Правильный синтаксис по стандарту SQL-2 - FULL OUTER JOIN, как и ответил funikovyuri.
К сожалению, Вы не правы. FULL OUTER JOIN не является эквивалентом UNION JOIN и наоборот, хотя при определенных условиях их результаты могут совпадать. FULL OUTER JOIN имеет пункт ON, UNION JOIN нет.
30 окт 04, 03:06    [1072742]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Blob
Member

Откуда: Украина, Харьков
Сообщений: 237
Blob
RIGHT OUTER JOIN Classes ON
Outcomes.Ship = Classes.Class OR Ships.Class = Classes.Class[/src]

Вношу поправочку, если брать эту БД с кораблями, то для нахождения всех кораблей, чьи классы известны, нужен не RIGHT, а INNER JOIN. Погорячился.
30 окт 04, 11:14    [1072819]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Blob
Member

Откуда: Украина, Харьков
Сообщений: 237
Cat2
Dedushka Mazai. То, что в Вашей книжке написано, на сегодняшний день является брехней.

Причем, я предполагаю, что Вас интересуют только корабли из таблы Outcomes.

Select * from Outcomes as O
join Ships as S on S.name=O.Ship
join classes as C on C.class=S.class


1) Как такие уважаемые дяди, как Грофф, могут заниматься брехнёй? Кстати в данной книжке описывается именно SQL стандарта ANSI/ISO92. Думаю, что вы заблуждаетесь, говоря, что UNION - устаревший синтаксис, а FULL - нет. Просто это разные вещи. FULL - полное внешнее, а UNION - простое объединение, ему нельзя приписать условие отбора ON. Мне просто любопытно было, есть ли СУБД, где синтаксис UNION JOIN допустим.

2) Я наверное плохо сформулировал. Интересуют корабли и из Ships, и из Outcomes. Причём из Outcomes те, чъё имя совпадает с именем класса из Classes. Так что запрос должен возвращать то, что у меня.

3) А какой у вас Аксесс? У меня Access2000, и не поддерживает FULL OUTER.
30 окт 04, 11:51    [1072830]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Blob
Member

Откуда: Украина, Харьков
Сообщений: 237
Alexey Kudinov
MSSQL
declare @table1 Table(St1 char(1))
INSERT @table1(St1) SELECT 'A' UNION SELECT 'B' UNION SELECT 'C'
declare @table2 Table(St1 int)
INSERT @table2(St1) SELECT 1 UNION SELECT 2 UNION SELECT 3
SELECT * FROM @table1 T1
	FULL JOIN @table2 T2
		ON T1.st1 = CAST(T2.st1 AS CHAR)
?

Да, возможно такой запрос имеет большее практическое значение.
Но если всё-таки где-то есть UNION JOIN, думаю, что он возвращает то же, что и у funikovyuri.
ИМХО, если UNION, то никакие условия отбора не должны срабатывать:
declare @table1 Table(St1 char(1))
INSERT @table1(St1) SELECT 'A' UNION SELECT 'B' UNION SELECT 'C' UNION SELECT '1'
declare @table2 Table(St1 int)
INSERT @table2(St1) SELECT 1 UNION SELECT 2 UNION SELECT 3

SELECT * FROM @table1 T1
	FULL JOIN @table2 T2
		ON T1.st1 = CAST(T2.st1 AS CHAR) 
- возвращает

St1 St1
---- -----------
A NULL
B NULL
C NULL
1 1
NULL 2
NULL 3
declare @table1 Table(St1 char(1))
	INSERT @table1(St1) SELECT 'A' UNION SELECT 'B' UNION SELECT 'C' UNION SELECT '1'
declare @table2 Table(St1 int)
	INSERT @table2(St1) SELECT 1 UNION SELECT 2 UNION SELECT 3

select st1 tab1_str1,null tab1_str2 from @table1
UNION
select null tab1_str1,st1 tab1_str2 from @table2
- возвращает

tab1_str1 tab1_str2
--------- -----------
A NULL
B NULL
C NULL
1 NULL
NULL 1
NULL 2
NULL 3
30 окт 04, 12:14    [1072835]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Dedushka Mazai
Member

Откуда:
Сообщений: 959
2 cat2:
за что, Герасим?
1 ноя 04, 13:15    [1074837]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
Ну еще как вариант :)
declare @table1 Table(St1 char(1))
INSERT @table1(St1) SELECT 'A' UNION SELECT 'B' UNION SELECT 'C' UNION SELECT '1'
declare @table2 Table(St1 int)
INSERT @table2(St1) SELECT 1 UNION SELECT 2 UNION SELECT 3

SELECT * FROM @table1 T1
	FULL JOIN @table2 T2
		ON 1=0
1 ноя 04, 14:05    [1075075]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
dimitr
Member

Откуда: PNZ
Сообщений: 7008
Blob
В книжке Джеймс Грофф, Поль Вайнберг "SQL. Полное руководство". Изд-во BHV, 1999 г. описана инструкция ANSI/ISO SQL92 "расширенный запрос не объединение":
SELECT * FROM Table1 UNION JOIN Table2

А какая СУБД поддерживает эту инструкцию? MS SQL насколько я понял нет. А может я неправильно законспектировал синтаксис?


У меня нет под рукой спецификации SQL92, но в более поздних версиях стандарта такой конструкции нет, насколько я в курсе. Поэтому ее никто и не поддерживает.
1 ноя 04, 14:38    [1075176]     Ответить | Цитировать Сообщить модератору
 Re: В какой СУБД есть "расш. запрос на объединение"  [new]
Blob
Member

Откуда: Украина, Харьков
Сообщений: 237
funikovyuri
Ну еще как вариант :)
declare @table1 Table(St1 char(1))
INSERT @table1(St1) SELECT 'A' UNION SELECT 'B' UNION SELECT 'C' UNION SELECT '1'
declare @table2 Table(St1 int)
INSERT @table2(St1) SELECT 1 UNION SELECT 2 UNION SELECT 3

SELECT * FROM @table1 T1
	FULL JOIN @table2 T2
		ON 1=0

Круто :)
2 ноя 04, 17:59    [1078695]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить