Имя: Пароль:
IT
Админ
Составить запрос без временных таблиц и вложенных запросов
0 DTX 4th
 
21.01.16
14:08
Есть две таблицы А и В. У B есть табличная часть B.rows
Реквизиты А:
id

Реквизиты B:
id
type

Реквизиты B.rows:
b_id
a_id
sum

Как составить запрос, который к таблице А присоединит левым соединением B.rows, у которых type = 0?
1 ДенисЧ
 
21.01.16
14:13
А что, за временные таблицы и вложенные запросы тебя расстреляют?
2 FIXXXL
 
21.01.16
14:15
условие на rows.Ссылка.type
3 FIXXXL
 
21.01.16
14:16
(2) ну и соединение А с ТабЧастью В
4 kosts
 
21.01.16
14:19
Ну и соединяй последовательно левым соединением все три таблицы
5 asady
 
21.01.16
14:25
select
A.id,
BRows.b_id,
BRows.a_id,
BRows.sum,
B.type
from A as A
left join B.Rows as BRows
inner join B as B
on BRows.b_id=D.id
and B.type=0
on A.id = BRows.a_id
6 DTX 4th
 
21.01.16
14:27
(1) Вопрос на подумать.

Методом тыка я дошёл до

Select
A.id,
Br.Sum
FROM
A
LEFT JOIN Br on A.id = Br.a_id
LEFT JOIN B on B.id = Br.b_id AND B.type = 0


Но не очень понимаю, как он работает.
Вроде сначала должны приджойнится все строки B.rows, а потом не все строки B.. Но почему-то строки B.rows с B.rows.b_id.type <> 0 пропадают
7 DTX 4th
 
21.01.16
14:29
(5) Хм.. После join может не идти ON?
8 DTX 4th
 
21.01.16
14:34
(5) И inner join будет относится таблица A LEFT JOIN B.rows? В выборке не пропадут строки А, которых нет в B.rows?
9 FIXXXL
 
21.01.16
14:37
отбери во временную таблицу из В по условию, приладь сбоку А
10 FIXXXL
 
21.01.16
14:37
(9) сорри, нельзя временные :)
11 DTX 4th
 
21.01.16
14:37
(9) Хочется понять, можно ли обойтись без временных таблиц.
12 f_vadim
 
21.01.16
14:41
(11) для понимания покури декартово произведение, посмотри результаты джойнов по условию ON true.
13 asady
 
21.01.16
14:42
(7) как видишь! эта запиь не противоречит синтаксису t-sql
(8)  inner join относиться только к связи B.rows и B
все записи из A  будут в результирующей таблице
14 DTX 4th
 
21.01.16
14:49
(12) Что такое декартово произведения, я в курсе. Но при чем тут это?

(13) Т.е. порядок ON на результат не влияет?

>inner join относиться только к связи B.rows и B
Это потому что он идёт после left join B.rows? Или из-за условия ON?
15 f_vadim
 
21.01.16
14:51
(14) >>Что такое декартово произведения, я в курсе. Но при чем тут это?
при всём. уточняю - декартово произведение таблиц
16 f_vadim
 
21.01.16
14:53
курсач что ли пишешь?
17 asady
 
21.01.16
14:54
(14) inner join относится к  связи B.Rows и B потому что между ними ключевое слово inner join
18 DTX 4th
 
21.01.16
15:05
(16) Не, просто сайтец.

(17) Ладно, примерно понятно.. Дома буду пробовать. Спасибо!
19 DTX 4th
 
22.01.16
00:35
(5) (13) Фокус с перестановкой ON не прокатил.. Unknown column in ON clause.

Inner join тоже потёр некоторые строки A..
20 asady
 
22.01.16
08:07
(19) мускул? постгри? скуль какой?

можно и переделать:

select
A.id,
Bt.b_id,
Bt.a_id,
Bt.sum,
Bt.type
from A as A
left join (select BRows.b_id, BRows.a_id, Brows.sum, B.type from B.Rows as BRows
inner join B as B
on BRows.b_id=B.id
and B.type=0) as Bt
on A.id = Bt.a_id


но в варианте (5) должно было работать  в большинстве скулей
21 los_hooliganos
 
22.01.16
08:14
Недорос еще до cross join
22 HardBall
 
22.01.16
10:33
(20) Вложенный запрос же
23 DTX 4th
 
22.01.16
12:01
(20) Вчера же хотел написать...
Вроде MySQL community server 5.0

(21) Для того и тема.
24 asady
 
22.01.16
15:44
(23) запрос в (5) успешно проходит проверку синтаксиса
на сайте http://ru.piliapp.com/mysql-syntax-check/

как впрочем и запрос из (20)
25 DTX 4th
 
22.01.16
23:07
(24) Судя по всему, не всё он проверяет.
5.5.25 - MySQL Community Server (GPL)
Основная теорема систематики: Новые системы плодят новые проблемы.