Вопрос по полям

Привет всем. Вопрос такой:
У меня есть 2 таблицы:

1.
| id | time | lenta |
| 0 | 123 | Math |

2.
id | time
123 | 8:30

Как сделать так, чтобы при выполнении команды select таблицы 1, у меня вывелось:
0 | 8:30 | Math
, а не
0 | 123 | math

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

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 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)
----------------------------------------------------------------------------------- "ls /" (C) Козьма Прутков

Большое

Большое спасибо за совет, но если Ты мегагуру, то не стоит другим высказывать их недостатки... Ведь я может только учусь еще.

А за совет спасибо. Разобрался и использую
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,

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". Я недавно закончил его выкладывать - посмотри в разделе документации.

-----------------------------------------------------------------------------------

"ls /" (C) Козьма Прутков


Большое

Большое спасибо, мегаГУРУ =)

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023