Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: многотабличный запрос с использованием JOIN

Сообщения:  [1-10]    [11-20]  [21-23] 

 
 автор: Trianon   (13.07.2007 в 12:52)   письмо автору
 
   для: oradev   (13.07.2007 в 03:28)
 

>Я который раз убеждаюсь, что вы не хотите меня слушать, а пересказываете план выполнения запроса.


>Я уже сказал, что опечатка в привиденном запросе автора топика,
Кто Вам это сказал? Автор?
Я ни Вашей трактовки текста запроса, ни подтверждения её автором топика не увидел.

>ясно что из таблицы block нужно выбирать перечисленные столбцы.
Запрос их именно оттуда и выбирает, судя по (11.07.2007 в 23:01)
С этим никто не спорит.

>А во вторых я пытаюсь до вас всю ночь довести, что

>SELECT id,head, link, style FROM block JOIN blocks ON blocks.id_block=block.id;
>SELECT id,head, link, style FROM block;
>Это не одно и тоже. Вы суть то понимаете или нет.

Это не одно и то же. Второй просто выведет таблицу.
Результатом первого будет ambigous column id.

Когда исправите ошибки, можем продолжить.

PS. Я очень сомневаюсь, что в теме соединений таблиц Вы сможете объяснить мне что-то, что я не знаю. В других темах - несомненно, с ораклом мне приходилось работать нечасто.
Но в этой - увы.

   
 
 автор: oradev   (13.07.2007 в 03:28)   письмо автору
 
   для: Trianon   (13.07.2007 в 02:47)
 

Я который раз убеждаюсь, что вы не хотите меня слушать, а пересказываете план выполнения запроса.

Я уже сказал, что опечатка в привиденном запросе автора топика, ясно что из таблицы block нужно выбирать перечисленные столбцы. А во вторых я пытаюсь до вас всю ночь довести, что

SELECT id,head, link, style FROM block JOIN blocks ON blocks.id_block=block.id;
SELECT id,head, link, style FROM block;

Это не одно и тоже. Вы суть то понимаете или нет.

   
 
 автор: Trianon   (13.07.2007 в 02:47)   письмо автору
 
   для: oradev   (13.07.2007 в 02:25)
 

>Давайте по фактам, ваша фраза:
Ок.
>>На мой взгляд, запрос практического смысла не имеет. Именно из-за того, что не выбирается ничего из таблицы blocks.
>Относительно запроса SELECT head, link, style FROM blocks JOIN block ON blocks.id_block=block.id;
>Вызывает у меня некое непонимание вами теории проектирования БД, а именно:
>1) Из таблицы blocks как раз-таки все выбирается в этом случаи.

Выбираются поля head, link, style. Все они принадлежат таблице block.
Из таблицы blocks вышеприведенным запросом не выбирается ни одного столбца.


>2)Вы поймите что стоит применить магию как мы получим разные запросы
>SELECT id_block,head, link, style FROM blocks JOIN block ON blocks.id_block=block.id;
>SELECT id_block,head, link, style FROM blocks;
>Второй запрос не всегда эквивалентен первому.

Чтобы получить ошибку (unknown column head in field list) во втором запросе, совсем не обязательно применять магию. Естественно, корректный и ошибочный запрос друг другу не эквивалентны.

PS. На Вашем месте делать выводы о том, у кого и как обстоит с теорией проектирования БД я бы поостерегся.
Я, вот, не делаю, не смотря на то, что Вы тут насочиняли.

   
 
 автор: oradev   (13.07.2007 в 02:25)   письмо автору
 
   для: Trianon   (12.07.2007 в 10:45)
 

Давайте по фактам, ваша фраза:
>На мой взгляд, запрос практического смысла не имеет. Именно из-за того, что не выбирается ничего из таблицы blocks.
Относительно запроса
SELECT head, link, style FROM blocks JOIN block ON blocks.id_block=block.id;

Вызывает у меня некое непонимание вами теории проектирования БД, а именно:

1) Из таблицы blocks как раз-таки все выбирается в этом случаи. Ну опечатка наверное!
2)Вы поймите что стоит применить магию как мы получим разные запросы

SELECT id_block,head, link, style FROM blocks JOIN block ON blocks.id_block=block.id;

SELECT id_block,head, link, style FROM blocks;

Второй запрос не всегда эквивалентен первому.

   
 
 автор: Trianon   (13.07.2007 в 01:43)   письмо автору
 
   для: oradev   (13.07.2007 в 01:06)
 

Момент первый.
Строки таблицы blocks с внешним ключом id_block содержащим NULL вообще никак не повлияют на результат запроса, потому что соединение внутреннее, а равенство NULL тождественно равно false. И значит такие строки не образуют JOIN-ON соответствий в принципе.
Так что не "ограничиваете" а "исключаете".

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

Момент третий.
строки block, которым нашлось несколько таких соответствий (ключ то чужой!) будут размножены одинаковыми. Они отличались бы, будь в списке полей SELECT хотя бы одно поле из левой таблицы.

   
 
 автор: oradev   (13.07.2007 в 01:06)   письмо автору
 
   для: oradev   (12.07.2007 в 23:31)
 

>Судя по привиденным структурам таблиц, вы имеете
>Таблицу block - родительская
>Таблицу blocks - дочернюю
>
>Вот этот запрос:
>SELECT head, link, style FROM blocks JOIN block ON blocks.id_block=block.id;
>
>выбирает соответствующие столбцы из дочерней таблицы blocks.
>

>Но вы ограничиваете строки у которых внешний ключ id_block равен NULL
>поскольку первичный ключ id таблицы block  ни при каких случаях не может быть равен NULL
>


Читаете узнаете

   
 
 автор: Trianon   (13.07.2007 в 00:45)   письмо автору
 
   для: oradev   (13.07.2007 в 00:39)
 

Замечательно. Какое отношение имеет семантическое различие вызовов COUNT(column) и COUNT(*) к операции внутреннего соединения таблиц?

   
 
 автор: oradev   (13.07.2007 в 00:39)   письмо автору
 
   для: Trianon   (13.07.2007 в 00:28)
 

>А что с ним не так?
>Это уже начинает становиться забавным....


create table emp_copy
(job VARCHAR2(20));

insert into emp_copy values('CLERK');
insert into emp_copy values('MANAGER');
insert into emp_copy values(NULL);

select count(*) from emp_copy;

3
select count(job) from emp_copy;

2

   
 
 автор: oradev   (13.07.2007 в 00:28)   письмо автору
 
   для: Roma   (12.07.2007 в 17:57)
 

>тогда можо хотя бы пример, когда используется LEFT JOIN (вместе со структурой таблиц)

В номенклатуре ANSI/SQL это выглядит вот так:


select e.ename, d.DEPTNO
from emp e LEFT OUTER JOIN dept d
ON e.DEPTNO = d.DEPTNO;


Или так:

select e.ename, d.deptno
from emp e RIGHT OUTER JOIN dept d
ON e.DEPTNO = d.DEPTNO;


где dept - таблица отелов, emp - таблица служащих в данных отделах ( из расчета служащий может работать только в одном департаменте)

   
 
 автор: Trianon   (13.07.2007 в 00:28)   письмо автору
 
   для: oradev   (13.07.2007 в 00:24)
 

А что с ним не так?
Это уже начинает становиться забавным....

   

Сообщения:  [1-10]    [11-20]  [21-23] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования