Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объединение таблиц без join / 25 сообщений из 36, страница 1 из 2
03.06.2007, 00:17
    #34570109
Ellias
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
На http://en.wikipedia.org/wiki/Object-relational_database
лежит пример:

Another advantage to the object-relational model is that the database can make use of the relationships between data to easily collect related records. In an address book application, an additional table would be added to the ones above to hold zero or more addresses for each user. Using a traditional RDBMS, collecting information for both the user and their address requires a "join":

SELECT InitCap(C.Surname) || ', ' || InitCap(C.FirstName), A.city
FROM Customers C, Addresses A
WHERE A.Cust_Id=C.Id -- the join
AND A.city="New York"

The same query in an object-relational database is much simpler:

SELECT Formal( C.Name )
FROM Customers C
WHERE C.address.city ="New York" -- the linkage is 'understood' by the ORDB

Возможно ли такое в Postgres и как так сделать.
...
Рейтинг: 0 / 0
03.06.2007, 11:47
    #34570284
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
ElliasНа http://en.wikipedia.org/wiki/Object-relational_database
лежит пример:

Another advantage to the object-relational model is that the database can make use of the relationships between data to easily collect related records. In an address book application, an additional table would be added to the ones above to hold zero or more addresses for each user. Using a traditional RDBMS, collecting information for both the user and their address requires a "join":

SELECT InitCap(C.Surname) || ', ' || InitCap(C.FirstName), A.city
FROM Customers C, Addresses A
WHERE A.Cust_Id=C.Id -- the join
AND A.city="New York"

The same query in an object-relational database is much simpler:

SELECT Formal( C.Name )
FROM Customers C
WHERE C.address.city ="New York" -- the linkage is 'understood' by the ORDB

Возможно ли такое в Postgres и как так сделать.
ИМХО нет. И, честно говоря, не совсем ясно ЧТО и главное ЗАЧЕМ надо? JOIN все равно будет происходить (если в основе лежат RDBSные таблицы).

Ну, а Постгрес в первую очередь все таки RDBMS, а объектность его в том, что он может наследовать таблицы. Даже толком инкапсуляции нет. Да и полиморфизм...
...
Рейтинг: 0 / 0
05.06.2007, 16:35
    #34575651
w
w
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
Средствами PostgreSQL это делается легко. Итак

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TYPE adress AS(
country     text,
city          text,
street       text);

CREATE TABLE customers(
klients_id   integer,
name        text,
surname    text,
adrese      adress);

INSERT INTO customers
       VALUES( 102 , 'John', 'Smith', ROW('USA', 'Dallas', 'Black 1-22'));

SELECT name
FROM   customers
WHERE (adrese).city='Dallas';

Желаю удачи ;)
...
Рейтинг: 0 / 0
06.06.2007, 09:43
    #34576844
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
wСредствами PostgreSQL это делается легко. Итак

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TYPE adress AS(
country     text,
city          text,
street       text);

CREATE TABLE customers(
klients_id   integer,
name        text,
surname    text,
adrese      adress);

INSERT INTO customers
       VALUES( 102 , 'John', 'Smith', ROW('USA', 'Dallas', 'Black 1-22'));

SELECT name
FROM   customers
WHERE (adrese).city='Dallas';

Желаю удачи ;)
Мда, век живи - век учись.
Стоит отметить, что в текущих релизах ПГ низзя сделать массив композитных типов (вроде в 8.3 появляется). Т.е. это, на данный момент не совсем полный аналог двух таблиц, связанных FK.
...
Рейтинг: 0 / 0
06.06.2007, 10:48
    #34577038
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
Andrey Daeron Мда, век живи - век учись.
Стоит отметить, что в текущих релизах ПГ низзя сделать массив композитных типов (вроде в 8.3 появляется). Т.е. это, на данный момент не совсем полный аналог двух таблиц, связанных FK.а так~
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE adress AS(
adress_id integer,
country     text,
city          text,
street       text);

CREATE TABLE customerss(
klients_id   integer DEFAULT ... ,
name        text,
surname    text,
adress_id   integer);

CREATE VIEW customers(
klients_id   integer,
name        text,
surname    text,
adrese      adress);

CREATE RULE ... DO INSTEAD ....
....

INSERT INTO customers
       VALUES( 102 , 'John', 'Smith', ROW('USA', 'Dallas', 'Black 1-22'));

SELECT name
FROM   customers
WHERE (adrese).city='Dallas';
будет совсем похоже.
...
Рейтинг: 0 / 0
06.06.2007, 10:51
    #34577049
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
assa Andrey Daeron Мда, век живи - век учись.
Стоит отметить, что в текущих релизах ПГ низзя сделать массив композитных типов (вроде в 8.3 появляется). Т.е. это, на данный момент не совсем полный аналог двух таблиц, связанных FK.а так~
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE adress AS(
adress_id integer,
country     text,
city          text,
street       text);

CREATE TABLE customerss(
klients_id   integer DEFAULT ... ,
name        text,
surname    text,
adress_id   integer);

CREATE VIEW customers(
klients_id   integer,
name        text,
surname    text,
adrese      adress);

CREATE RULE ... DO INSTEAD ....
....

INSERT INTO customers
       VALUES( 102 , 'John', 'Smith', ROW('USA', 'Dallas', 'Black 1-22'));

SELECT name
FROM   customers
WHERE (adrese).city='Dallas';
будет совсем похоже.

А че такое
Код: plaintext
1.
2.
3.
4.
5.
CREATE VIEW customers(
klients_id   integer,
name        text,
surname    text,
adrese      adress);
???
ПГ ваще говорит : ERROR: syntax error в или рядом "integer" at character 38
...
Рейтинг: 0 / 0
06.06.2007, 11:10
    #34577099
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
msa@n-e.ru А че такое
Код: plaintext
1.
2.
3.
4.
5.
CREATE VIEW customers(
klients_id   integer,
name        text,
surname    text,
adrese      adress);
???
ПГ ваще говорит : ERROR: syntax error в или рядом "integer" at character 38
гм. отвлекли - запутали. :) не доправил.
нада создать вью. что-то типа ~
Код: plaintext
1.
2.
3.
4.
5.
CREATE VIEW customers AS SELECT 
c.klients_id,
c.name,
c.surname,
a.adress as adrese
FROM customerss c LEFT JOIN  adress a USING  adress_id;
...
Рейтинг: 0 / 0
06.06.2007, 11:24
    #34577144
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
assa msa@n-e.ru А че такое
Код: plaintext
1.
2.
3.
4.
5.
CREATE VIEW customers(
klients_id   integer,
name        text,
surname    text,
adrese      adress);
???
ПГ ваще говорит : ERROR: syntax error в или рядом "integer" at character 38
гм. отвлекли - запутали. :) не доправил.
нада создать вью. что-то типа ~
Код: plaintext
1.
2.
3.
4.
5.
CREATE VIEW customers AS SELECT 
c.klients_id,
c.name,
c.surname,
a.adress as adrese
FROM customerss c LEFT JOIN  adress a USING  adress_id;


Как-то конструкция
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE VIEW customers AS SELECT 
c.klients_id,
c.name,
c.surname,
a.adress as adrese
FROM customerss c LEFT JOIN  adress a USING  adress_id;

не очень вяжется с топиком :-)))) "Объединение таблиц без join"
...
Рейтинг: 0 / 0
06.06.2007, 11:29
    #34577163
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
msa@n-e.ruне очень вяжется с топиком :-)))) "Объединение таблиц без join"гм. зато "зин таксист" селекта вяжется с желаемым в изходном топике афтора. А что ообд маскируют реальные джойны... - дык если в руках вструмент, позволяющий повторить желаемое поведение, токмо руками - в чем проблема?
...
Рейтинг: 0 / 0
06.06.2007, 11:59
    #34577183
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
assa msa@n-e.ruне очень вяжется с топиком :-)))) "Объединение таблиц без join"гм. зато "зин таксист" селекта вяжется с желаемым в изходном топике афтора. А что ообд маскируют реальные джойны... - дык если в руках вструмент, позволяющий повторить желаемое поведение, токмо руками - в чем проблема?

Лично мне больше нравится вариант, предложенный ДубльВе, с использованием типов. Да и процедура JOIN, наверное, не такая уж и простая в смысле ресурсоемкости.
...
Рейтинг: 0 / 0
06.06.2007, 12:14
    #34577229
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
msa@n-e.ru Лично мне больше нравится вариант, предложенный ДубльВе, с использованием типов. Да и процедура JOIN, наверное, не такая уж и простая в смысле ресурсоемкости.ндравится - берите.
вот токо когда найдете в этом варианте объединение таблиц - сообщите. А пока это просто денормализованная плоская таблица, часть полей которой выдаются одним блоком - составным полем. И все. нашли чем чваниться.
...
Рейтинг: 0 / 0
06.06.2007, 12:38
    #34577319
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
assa msa@n-e.ru Лично мне больше нравится вариант, предложенный ДубльВе, с использованием типов. Да и процедура JOIN, наверное, не такая уж и простая в смысле ресурсоемкости.ндравится - берите.
вот токо когда найдете в этом варианте объединение таблиц - сообщите. А пока это просто денормализованная плоская таблица, часть полей которой выдаются одним блоком - составным полем. И все. нашли чем чваниться.

Ваш пример не совсем понятен.

Первой конструкцией
Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE adress AS(
adress_id integer,
country     text,
city          text,
street       text);
Вы пытались сделать тип или таблицу? По смыслу похоже на тип, только почему то написано CREATE TABLE, да и потом Вы используете отношение adress в выражении LEFT JOIN
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE VIEW customers AS SELECT 
c.klients_id,
c.name,
c.surname,
a.adress as adrese
FROM customerss c LEFT JOIN  adress a USING  adress_id;
...
Рейтинг: 0 / 0
06.06.2007, 12:53
    #34577382
Ellias
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
В общето я думал что постгри сам должен додумываться прилепливать таблицы по Forign Key. А педъявленные выше примеры похожи на манст###цию.
...
Рейтинг: 0 / 0
06.06.2007, 13:03
    #34577430
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
ElliasВ общето я думал что постгри сам должен додумываться прилепливать таблицы по Forign Key. А педъявленные выше примеры похожи на манст###цию.А какие СУБД сами додумываются?
...
Рейтинг: 0 / 0
06.06.2007, 13:08
    #34577454
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
msa@n-e.ru Ваш пример не совсем понятен.

Первой конструкцией

Вы пытались сделать тип или таблицу? По смыслу похоже на тип, только почему то написано а что, расписать идею самостийно - уже никак? там же стоит значой ~ (приблизительно таг:)
"по смыслу"... мда... как-то даже трудно комментировать такие дахадки. (кстати, создание таблицы (и вью) создает и тип).

однако вот вам "оттестированный" на синтаксис код.
без руле, конечно - т.к. для руле по хорошему надо написать процедуру. (Шобы 1. Перерасчет Default-ов в New обойти и 2. Дубликаты в адресах не плодить.)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE adress (
adress_id serial,
country     text,
city          text,
street       text
,CONSTRAINT adress_pkey PRIMARY KEY (adress_id) );

CREATE TABLE customerss(
klients_id   serial ,
name        text,
surname    text,
adress_id   integer
,CONSTRAINT customerss_pkey PRIMARY KEY (klients_id)
,CONSTRAINT adress_fkey FOREIGN KEY (adress_id)  REFERENCES adress (adress_id) ON DELETE RESTRICT);

CREATE VIEW customers AS SELECT 
c.klients_id,
c.name,
c.surname,
a as adrese --указывать тип не нада, возвращает тип таблицы
FROM customerss c LEFT JOIN  adress a USING  (adress_id);
--CREATE RULE ...
--INSERT INTO ...
SELECT *, (c.adrese).country FROM customers c; --тестируем
...
Рейтинг: 0 / 0
06.06.2007, 13:11
    #34577464
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
ElliasВ общето я думал что постгри сам должен додумываться.гм. В абщёте вы преуспели.
...
Рейтинг: 0 / 0
06.06.2007, 13:25
    #34577522
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
assa msa@n-e.ru Ваш пример не совсем понятен.

Первой конструкцией

Вы пытались сделать тип или таблицу? По смыслу похоже на тип, только почему то написано а что, расписать идею самостийно - уже никак? там же стоит значой ~ (приблизительно таг:)
"по смыслу"... мда... как-то даже трудно комментировать такие дахадки. (кстати, создание таблицы (и вью) создает и тип).

однако вот вам "оттестированный" на синтаксис код.
без руле, конечно - т.к. для руле по хорошему надо написать процедуру. (Шобы 1. Перерасчет Default-ов в New обойти и 2. Дубликаты в адресах не плодить.)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE adress (
adress_id serial,
country     text,
city          text,
street       text
,CONSTRAINT adress_pkey PRIMARY KEY (adress_id) );

CREATE TABLE customerss(
klients_id   serial ,
name        text,
surname    text,
adress_id   integer
,CONSTRAINT customerss_pkey PRIMARY KEY (klients_id)
,CONSTRAINT adress_fkey FOREIGN KEY (adress_id)  REFERENCES adress (adress_id) ON DELETE RESTRICT);

CREATE VIEW customers AS SELECT 
c.klients_id,
c.name,
c.surname,
a as adrese --указывать тип не нада, возвращает тип таблицы
FROM customerss c LEFT JOIN  adress a USING  (adress_id);
--CREATE RULE ...
--INSERT INTO ...
SELECT *, (c.adrese).country FROM customers c; --тестируем


Гораздо проще ИМХО и изящней вариант с типами.
...
Рейтинг: 0 / 0
06.06.2007, 13:42
    #34577594
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
msa@n-e.ru Гораздо проще ИМХО и изящней вариант с типами.глупасти-то не нада пИсать.
нет никакого вар-та с типами.
Ибо там нет объединения таблиц.
А есть одна, бла, плоская, бла, та бла.
Если это еще не доходит - просто поверьте и постарайтесь забыть.
Или почитайте книшку по проектированию БД.
...
Рейтинг: 0 / 0
06.06.2007, 13:43
    #34577597
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
падобраму канешна
...
Рейтинг: 0 / 0
06.06.2007, 13:46
    #34577620
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
assa msa@n-e.ru Гораздо проще ИМХО и изящней вариант с типами.глупасти-то не нада пИсать.
нет никакого вар-та с типами.
Ибо там нет объединения таблиц.
А есть одна, бла, плоская, бла, та бла.
Если это еще не доходит - просто поверьте и постарайтесь забыть.
Или почитайте книшку по проектированию БД.

Вариант с типами есть. И, действительно, там нет никакого объединения. Как раз то, о чем говориться в топике.
...
Рейтинг: 0 / 0
06.06.2007, 13:51
    #34577647
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
msa@n-e.ruВариант с типами есть. И, действительно, там нет никакого объединения. Как раз то, о чем говориться в топике.вас еще и читать поучить?
топик (пока) называется
" Объединение таблиц без join "

а вариант бд с одной плоской таблицей всегда есть. только это вариант не из этого топика, радной.
т.ч. лучше-бы вам о нем втихую забыть и не вспоминать. тем более не писать про якобы "изячество" этого якобы "варианта".
...
Рейтинг: 0 / 0
06.06.2007, 13:52
    #34577653
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
assa msa@n-e.ruВариант с типами есть. И, действительно, там нет никакого объединения. Как раз то, о чем говориться в топике.вас еще и читать поучить?
топик (пока) называется
" Объединение таблиц без join "

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

Основное в топике - это БЕЗ JOIN!!!!!! А у ВАС
Код: plaintext
1.
.... FROM customerss c LEFT JOIN  adress a USING  (adress_id);

Почитать бы поучиться ВАМ.
...
Рейтинг: 0 / 0
06.06.2007, 13:54
    #34577662
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
Вы сделали обыкновенный JOIN и спрятали это за "ширмочкой" под названием VIEW.
...
Рейтинг: 0 / 0
06.06.2007, 13:55
    #34577668
msa@n-e.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
...и это совсем не то, о чем спрашивает автор.
...
Рейтинг: 0 / 0
06.06.2007, 13:58
    #34577679
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение таблиц без join
msa@n-e.ru Основное в топике - это БЕЗ JOIN!!!!!! А у ВАС
Код: plaintext
1.
.... FROM customerss c LEFT JOIN  adress a USING  (adress_id);

Почитать бы поучиться ВАМ.давайте не будем делать <...> допущений об основном в таком простом предложении, как наименование топика. По моему оно весьма просто, чтобы быть целиком "основным"

Да и джойн у меня выступает в сокрытой от конечного пользователя реализации. Т.е. именно этой реализацией я и предоставляю конечному пользователю требуемый им синтаксис объединения без джойн
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объединение таблиц без join / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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