powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / В какой СУБД есть "расш. запрос на объединение"
15 сообщений из 15, страница 1 из 1
В какой СУБД есть "расш. запрос на объединение"
    #32761661
Blob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В книжке Джеймс Грофф, Поль Вайнберг "SQL. Полное руководство". Изд-во BHV, 1999 г. описана инструкция ANSI/ISO SQL92 "расширенный запрос не объединение":
Код: plaintext
SELECT * FROM Table1 UNION JOIN Table2
Допустим если
Код: plaintext
1.
2.
3.
4.
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 
То
Код: plaintext
SELECT * FROM @table1 UNION JOIN @table2
должно выдавать вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
       St1      St1
___________________________
        A       NULL
        B       NULL
        C       NULL
      NULL      1
      NULL      2
      NULL      3
___________________________
А какая СУБД поддерживает эту инструкцию? MS SQL насколько я понял нет. А может я неправильно законспектировал синтаксис?
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32761721
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем он отличается от
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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
?
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32761726
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а смысл-то какой в этой конструкции?
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32761815
Blob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dedushka Mazaiа смысл-то какой в этой конструкции?
Узнаю какой - напишу. Смысл постигается в процессе применения конструкций. Вот например в аксессе нет FULL OUTER JOIN - а он очень удобен, например когда есть вот такие таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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.
Я хочу сказать, что чтобы найти все корабли, для которых известны их классы, мне удобно сделать так:
Код: plaintext
1.
2.
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
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32761852
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем нужен full outer я думаю и так ясно :)
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32761871
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSSQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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)
?
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32761879
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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

===============
на самом деле, Вам нужно было задать свой вопрос в форуме по соответсвующему серверу.
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32761940
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Dedushka Mazai. То, что в Вашей книжке написаноМожет я что-то не понял, но где он упоминал какую-либо книжку ? Напраслиной отдает...
Cat2 на сегодняшний день является брехней. Расматривается устаревший синтексис.Вы про пример из первого поста Blob ? А почему брехня и устаревший ?
авторПравильный синтаксис по стандарту SQL-2 - FULL OUTER JOIN, как и ответил funikovyuri.К сожалению, Вы не правы. FULL OUTER JOIN не является эквивалентом UNION JOIN и наоборот, хотя при определенных условиях их результаты могут совпадать. FULL OUTER JOIN имеет пункт ON, UNION JOIN нет.
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32761999
Blob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blob RIGHT OUTER JOIN Classes ON
Outcomes.Ship = Classes.Class OR Ships.Class = Classes.Class[/src]
Вношу поправочку, если брать эту БД с кораблями, то для нахождения всех кораблей, чьи классы известны, нужен не RIGHT, а INNER JOIN. Погорячился.
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32762005
Blob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Dedushka 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.
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32762008
Blob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey KudinovMSSQL
Код: plaintext
1.
2.
3.
4.
5.
6.
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, то никакие условия отбора не должны срабатывать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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) 
- возвращает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
St1  St1         
---- ----------- 
A    NULL
B    NULL
C    NULL
1      1
NULL 2
NULL 3
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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
- возвращает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
tab1_str1 tab1_str2   
--------- ----------- 
A         NULL
B         NULL
C         NULL
1         NULL
NULL      1
NULL      2
NULL      3
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32763029
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 cat2:
за что, Герасим?
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32763155
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну еще как вариант :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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 
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32763229
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlobВ книжке Джеймс Грофф, Поль Вайнберг "SQL. Полное руководство". Изд-во BHV, 1999 г. описана инструкция ANSI/ISO SQL92 "расширенный запрос не объединение":
Код: plaintext
SELECT * FROM Table1 UNION JOIN Table2

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

У меня нет под рукой спецификации SQL92, но в более поздних версиях стандарта такой конструкции нет, насколько я в курсе. Поэтому ее никто и не поддерживает.
...
Рейтинг: 0 / 0
В какой СУБД есть "расш. запрос на объединение"
    #32765452
Blob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriНу еще как вариант :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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 

Круто :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / В какой СУБД есть "расш. запрос на объединение"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]