То добавляются AND и соответствующие таблицы и поля в запрос.
Вообще рекомендую на эту тему почитать Мартин Грабер "Понимание SQL"
Книжка в рунете весьма распространённая.
Если запрос получается офигенной длины, то стоит подумать - хорошо ли спроектирована структура БД?
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Занесение информации - это не выборка!
Для начала определись - что нужно смотреть и отталкивайся от этого.
Возможно частично решат проблему дополнительные VIEW
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
crete teable village(id int primary key default nextval('seq_village'), name text);
insert into village (name) values ('РОМАНОВКА');
crete teable city(id int primary key default nextval('seq_city'), name text);
insert into city (name) values ('ИГАРКА');
create table table1(city int references city(id),village int references village(id)); //причем в строке должна быть одна запись (город или деревня)
insert into table1 (city) values (1);
insert into table1 (village) values (1)
т.е. Таким образом?:
create view sel_city as select name from city;
create view sel_vil as select name from village;
create view sel_table1 as select (select * from sel_city where table1.city=city.id) as city,(select * from sel_vil where table1.village=village.id) as village from table1;
вот поврос... Если допустим у меня таблица 1
table1:
create sequence seq_city;
create sequence seq_village;
crete teable village(id int primary key default nextval('seq_village'), name text);
insert into village (name) values ('РОМАНОВКА');
crete teable city(id int primary key default nextval('seq_city'), name text);
insert into city (name) values ('ИГАРКА');
create table table1(city int references city(id),village int references village(id)); //причем в строке должна быть одна запись (город или деревня)
insert into table1 (city) values (1);
insert into table1 (village) values (1)
Для того, чтобы сделать выборку с пересечением:
select city.name,village.name from table1 left join city on (table1.city=city.id) join village on (table1.village=village.id);
выходит сообщение, что ни чего не найдено....
Я понимаю, что по логике я прошу сделать выборку по условию true && false=false... Подскажите как тогда выборку сделать при таких параметрах....
А ты вообще то, что нам выдал сам-то пробовал?
У тебя там в каждой строчке по две ошибки - как проверять?
Ты говоришь, что у тебя ничего не найдено, а у меня твой запрос возвращает:
# select city.name,village.name from table1 left join city on (table1.city=city.id)
join village on (table1.village=village.id);
name | name
------+-----------
| РОМАНОВКА
(1 запись)
Выборку с пересечением? А поточнее можно? Что ты хочешь увидеть? Имена городов и деревень в разных колонках?
Юзай:
# select city.name,village.name from table1 left outer join city on (table1.city=city.id)
left outer join village on (table1.village=village.id);
name | name
--------+-----------
ИГАРКА |
| РОМАНОВКА
(2 rows)
Имена городов и деревень в одной колонке? Юзай:
# select city.name as name from table1, city where table1.city=city.id
union select village.name as name from table1, village where table1.village=village.id;
name
-----------
ИГАРКА
РОМАНОВКА
(2 rows)
Большое спасибо за совет, но если Ты мегагуру, то не стоит другим высказывать их недостатки... Ведь я может только учусь еще.
А за совет спасибо. Разобрался и использую
select city.name,village.name from table1 left outer join city on (table1.city=city.id)
left outer join village on (table1.village=village.id); с дороботочкой как:
select city.name as city, village.name as village...
Я мегагуру? Я разбираюсь в SQL и в проектировании БД на уровне (по собственной оценке) ниже среднего.
И дело было не в том, что я выставляю свои умения в превосходной степени, а в том, что непонятно как отвечать на вопрос, смысла которого я не понимаю. Ладно мне было не лень и у меня было время создать временную базу, загрузить исправленные примеры и прогнать запрос, после чего предложить 3 варианта возможных ответов (делая догадки о том, что ты хотел в итоге получить). Но ведь так будет не всегда. Я кстати как раз общался с мегагуру - они вообще ничего в подробностях не считают нужным объяснять - здесь ошибка и тыкают в доку и всё - разбирайся. Я же готов отвечать на вопросы (в меру своих знаний, конечно) но для этого вопрос должен быть сформулирован так, чтобы он был понятен! Без обид, ок?
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Еще вопрос такой:
1. У меня есть Kladr, в нем районы, регионы, поселки, города.
2. Есть таблица на человека:
| id | surname | name | birthday | region | city
Делаю запрос:
select peoples.id,surname,peoples.name,birthday,kladr.name as region from peoples left join kladr on (peoples.rkoo=kladr.id); - он проходит
Получается таблица типа:
1 ИВАНОВ ИВАН 11111111 Красноярский
А на запрос:
select peoples.id,surname,peoples.name,birthday,kladr.name as region,kladr.name as city from peoples left join kladr on (peoples.rkoo=kladr.id and peoples.city=kladr.id); выдает
1 ИВАНОВ ИВАН 11111111 NULL NULL
Я конечно понимаю, что тупость пишу, но может есть способ как-то сделать, так, чтобы из одной таблицы можно было данные вытягивать. Сам я вижу только одно решение... Просто разбить таблицу Kladr на таблицы регионов, ройонов, городов, селл....
На первый взгляд у тебя неправильно спроектирована таблица Kladr
Но чтобы поточнее сказать приведи полные структуры таблиц, а также хотя бы пару строк данных, чтобы можно было делать запросы и наконец что бы ты хотел получить (как это должно выглядеть)
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
есть 2 таблицы:
kladr
| id | name | socr |
-----------------------
1 | Красноярский | край
2 | Хабаровский | край
3 | Владивосток | г
4 | Сосновоборск | г
peoples:
| id | surname | name | birthday | region | city |
1 | Иванов | Иван | 11111977 | 1 | 4
2 | Петров | Петр | 01011941 | 2 | 3
Готовый результат view view_peoples:
1 | Иванов | Иван | 11111977 | Красноярский | край | Сосновоборск | г
2 | Петров | Петр | 01011941 | Хабаровский | край | Владивосток | г
Пойдет?
ЗЫ. Я пока решил эту проблему таким образом:
select peoples.id,peoples.surname,peoples.name,birthday,(select name from kladr where peoples.region=kladr.id) as region,(select socr from kladr where peoples.region=kladr.id) as region_socr,(select name from kladr where peoples.city=kladr.id) as city,(select socr from kladr where peoples.city=kladr.id) as city_socr from peoples;
Но мне кажется, что это не выход... И еще если использовать такой метод на таблице с 3000000 записей, то он будет не оптимальным?
SELECT p.id, p.surname,
p.name,
p.birthday,
k.name AS region,
k.socr AS region_socr,
k1.name AS city,
k1.socr AS city_socr
FROM peoples p
INNER JOIN kladr k ON p.region=k.id
INNER JOIN kladr k1 ON p.city=k1.id;
id | surname | name | birthday | region | region_socr | city | city_socr
----+---------+------+----------+--------------+-------------+--------------+-----------
1 | Иванов | Иван | 11111977 | Красноярский | край | Сосновоборск | город
2 | Петров | Пётр | 01011941 | Хабаровский | край | Владивосток | город
(2 rows)
И после этого настоятельно советую сходить и почитать Мартина Грабера "Понимание SQL". Я недавно закончил его выкладывать - посмотри в разделе документации.
select t1.id, t2.time,
select t1.id, t2.time, t1.lenta
from table1 t1
left join table2 t2 on (t1.time = t2.id)
А если условие
А если условие будет сложное и множество таблиц со сравнением?
То добавляются
То добавляются AND и соответствующие таблицы и поля в запрос.
Вообще рекомендую на эту тему почитать Мартин Грабер "Понимание SQL"
Книжка в рунете весьма распространённая.
Делать
Делать множество соединений (join) и добавлять нужные условия (where).
А ни чего если
А ни чего если запрос получается офигенной длинны?
Если запрос
Если запрос получается офигенной длины, то стоит подумать - хорошо ли спроектирована структура БД?
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
просто очень
просто очень много информации нужно занести в таблицу и кучу полей с внешними ключами на словари....
Занесение
Занесение информации - это не выборка!
Для начала определись - что нужно смотреть и отталкивайся от этого.
Возможно частично решат проблему дополнительные VIEW
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
create sequence
create sequence seq_village;
crete teable village(id int primary key default nextval('seq_village'), name text);
insert into village (name) values ('РОМАНОВКА');
crete teable city(id int primary key default nextval('seq_city'), name text);
insert into city (name) values ('ИГАРКА');
create table table1(city int references city(id),village int references village(id)); //причем в строке должна быть одна запись (город или деревня)
insert into table1 (city) values (1);
insert into table1 (village) values (1)
т.е. Таким образом?:
create view sel_city as select name from city;
create view sel_vil as select name from village;
create view sel_table1 as select (select * from sel_city where table1.city=city.id) as city,(select * from sel_vil where table1.village=village.id) as village from table1;
select * from sel_table1; - таким образом?
вот поврос...
вот поврос... Если допустим у меня таблица 1
table1:
create sequence seq_city;
create sequence seq_village;
crete teable village(id int primary key default nextval('seq_village'), name text);
insert into village (name) values ('РОМАНОВКА');
crete teable city(id int primary key default nextval('seq_city'), name text);
insert into city (name) values ('ИГАРКА');
create table table1(city int references city(id),village int references village(id)); //причем в строке должна быть одна запись (город или деревня)
insert into table1 (city) values (1);
insert into table1 (village) values (1)
Для того, чтобы сделать выборку с пересечением:
select city.name,village.name from table1 left join city on (table1.city=city.id) join village on (table1.village=village.id);
выходит сообщение, что ни чего не найдено....
Я понимаю, что по логике я прошу сделать выборку по условию true && false=false... Подскажите как тогда выборку сделать при таких параметрах....
РЕБЯТА! УЧИТЕСЬ
А ты вообще то, что нам выдал сам-то пробовал?
Большое
Большое спасибо за совет, но если Ты мегагуру, то не стоит другим высказывать их недостатки... Ведь я может только учусь еще.
А за совет спасибо. Разобрался и использую
select city.name,village.name from table1 left outer join city on (table1.city=city.id)
left outer join village on (table1.village=village.id); с дороботочкой как:
select city.name as city, village.name as village...
Я мегагуру? Я
Я мегагуру? Я разбираюсь в SQL и в проектировании БД на уровне (по собственной оценке) ниже среднего.
И дело было не в том, что я выставляю свои умения в превосходной степени, а в том, что непонятно как отвечать на вопрос, смысла которого я не понимаю. Ладно мне было не лень и у меня было время создать временную базу, загрузить исправленные примеры и прогнать запрос, после чего предложить 3 варианта возможных ответов (делая догадки о том, что ты хотел в итоге получить). Но ведь так будет не всегда. Я кстати как раз общался с мегагуру - они вообще ничего в подробностях не считают нужным объяснять - здесь ошибка и тыкают в доку и всё - разбирайся. Я же готов отвечать на вопросы (в меру своих знаний, конечно) но для этого вопрос должен быть сформулирован так, чтобы он был понятен! Без обид, ок?
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Еще вопрос
Еще вопрос такой:
1. У меня есть Kladr, в нем районы, регионы, поселки, города.
2. Есть таблица на человека:
| id | surname | name | birthday | region | city
Делаю запрос:
select peoples.id,surname,peoples.name,birthday,kladr.name as region from peoples left join kladr on (peoples.rkoo=kladr.id); - он проходит
Получается таблица типа:
1 ИВАНОВ ИВАН 11111111 Красноярский
А на запрос:
select peoples.id,surname,peoples.name,birthday,kladr.name as region,kladr.name as city from peoples left join kladr on (peoples.rkoo=kladr.id and peoples.city=kladr.id); выдает
1 ИВАНОВ ИВАН 11111111 NULL NULL
Я конечно понимаю, что тупость пишу, но может есть способ как-то сделать, так, чтобы из одной таблицы можно было данные вытягивать. Сам я вижу только одно решение... Просто разбить таблицу Kladr на таблицы регионов, ройонов, городов, селл....
ЗЫ. Жду ваших советов.
На первый
На первый взгляд у тебя неправильно спроектирована таблица Kladr
Но чтобы поточнее сказать приведи полные структуры таблиц, а также хотя бы пару строк данных, чтобы можно было делать запросы и наконец что бы ты хотел получить (как это должно выглядеть)
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
есть 2
есть 2 таблицы:
kladr
| id | name | socr |
-----------------------
1 | Красноярский | край
2 | Хабаровский | край
3 | Владивосток | г
4 | Сосновоборск | г
peoples:
| id | surname | name | birthday | region | city |
1 | Иванов | Иван | 11111977 | 1 | 4
2 | Петров | Петр | 01011941 | 2 | 3
Готовый результат view view_peoples:
1 | Иванов | Иван | 11111977 | Красноярский | край | Сосновоборск | г
2 | Петров | Петр | 01011941 | Хабаровский | край | Владивосток | г
Пойдет?
ЗЫ. Я пока решил эту проблему таким образом:
select peoples.id,peoples.surname,peoples.name,birthday,(select name from kladr where peoples.region=kladr.id) as region,(select socr from kladr where peoples.region=kladr.id) as region_socr,(select name from kladr where peoples.city=kladr.id) as city,(select socr from kladr where peoples.city=kladr.id) as city_socr from peoples;
Но мне кажется, что это не выход... И еще если использовать такой метод на таблице с 3000000 записей, то он будет не оптимальным?
SELECT p.id, p.surname,
И после этого настоятельно советую сходить и почитать Мартина Грабера "Понимание SQL". Я недавно закончил его выкладывать - посмотри в разделе документации.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Большое
Большое спасибо, мегаГУРУ