Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Много вопросов по запросу / 17 сообщений из 17, страница 1 из 1
23.07.2007, 17:35
    #34678085
pavellift
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
Немного не там создаю, но там где нужно туда редко заходят :)

столкнулся вот с чем. запрос сейчас выглядит так
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
select
distinct (full_name), short_name,
acc, codeokpo,
address,

(Select phone, fax, email from vaccount a, contact ct
where acc='2600500004001'
 and  ct.idcustomer=a.idcustomer),

(select  desctext from customer c, jurdesctype jd, vaccount a, jurhistory j
where acc='2600500004001'
 and  c.idcustomer=a.idcustomer
 and  c.idcustomer=j.idcustomer
 and  j.desctype=jd.desctype
 and  j.desctype='305'),

num_reg, dt_reg,

(select risk_kod from risk r, vaccount a
where acc='2600500004001'
 and  a.idcustomer=r.idcustomer)  as  risk_kod,

(select remark from spr_risk_kod srk, risk r, vaccount a
where acc='2600500004001'
 and  a.idcustomer=r.idcustomer
 and  r.risk_kod=srk.risk_kod),

clt.link_type, clt.remark, surname, name, midname,

(select  desctext from customer c, jurdesctype jd, vaccount a, jurhistory j
where acc='2600500004001'
 and  c.idcustomer=a.idcustomer
 and  c.idcustomer=j.idcustomer
 and  j.desctype=jd.desctype
 and  j.desctype='211'),

c.userwork


from vaccount a,
address ad,
customer c,
-- contact ct,
priv_person pp,
customer_link cl,
customer_link_type clt,
tax_registration tr,
OUTER jurhistory j

where acc='2600500004001'

-- and  c.cstmr_type='Ю'
 and  j.idcustomer=c.idcustomer
 and  c.idcustomer=a.idcustomer
 and  c.idcustomer=ad.idcustomer
 and  c.idcustomer=ct.idcustomer
 and  cl.linktype=clt.link_type
 and  pp.idcustomer=cl.idcustmaster
 and  cl.idcustslave=c.idcustomer
 and  c.idcustomer=tr.idcustomer


Для этого customera в таблице contact вообще ничего нет поэтому он ему пытается всё вывести ну и сам понимаешь нифига не получается, как лучше обойти бок? Outer не получается
...
Рейтинг: 0 / 0
23.07.2007, 17:38
    #34678093
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
inner join, left join, right join
:)
...
Рейтинг: 0 / 0
23.07.2007, 17:49
    #34678136
pavellift
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
если бы всё было так легко

Код: plaintext
1.
(Select phone, fax, email from vaccount a left OUTER join contact ct on a.idcustomer=ct.idcustomer
where acc='2600500004001'),

та же песня субквери выводит не один row потому что для этого счёта нет ниодного упоминайя в таблице contact. еслибы там было бы что то, а нужные поля пустые, то тогда бы помогло, а так увы не помогает.
...
Рейтинг: 0 / 0
23.07.2007, 18:02
    #34678177
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
pavelliftесли бы всё было так легко

Код: plaintext
1.
(Select phone, fax, email from vaccount a left OUTER join contact ct on a.idcustomer=ct.idcustomer
where acc='2600500004001'),
.
Лишнее where acc='2600500004001'), если acc есть поле contact,
к тому же не мешало бы a.phone, a.fax
плюс OUTER лучше выкинуть
...
Рейтинг: 0 / 0
23.07.2007, 20:50
    #34678473
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
1. Наличие огромного количества подзапросов в SELECT clause - это уже нехорошо. Как правило, такое пишется не по необходимости, а от незнания. Основное место, где должны встречаться subquery - это FROM clause и условия IN/EXISTS/....

2. Не надо приводить такие запросы - вы думаете, многим захочется разбираться в вашей каше?
Чтобы проиллюстрировать ваш вопрос, можно сократить запрос до двух таблиц - customers и contact.
...
Рейтинг: 0 / 0
23.07.2007, 21:27
    #34678498
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
Насколько я понял, интересует довольно типичная задача - выполнить outer-соединения одной таблицы с некоторым подмножеством записей второй таблицы .

Возьмем наглядный пример (да простят меня бухгалтеры за вольности изложения их материи):
Есть таблица " Контрагенты " (Контрагент_ИД, Наименование, ...).
Есть таблица " Проводки " (Дата, СчетДебет, СчетКредит, Сумма, Контрагент_ИД, ...)
Требуется найти суммарные обороты по корреспонденции счетов Дебет10-Кредит51 с каждым контрагентом (если оборотов по данному контрагенту нет - обязательно вывести 0).

Вариант, который вероятно напишете вы:
Код: plaintext
1.
2.
3.
4.
select к.Наименование, SUM(п.Сумма)
from Контрагенты к 
  left outer join Проводки п on к.Контрагент_ИД=п.Контрагент_ИД
where п.СчетДебет='10' and п.СчетКредит='51'
group by к.Контрагент_ИД, к.Наименование

Вариант не работает - он не выведет нули по тем контрагентам, с которыми таких проводок не было, потому что одной рукой здесь я написал outer join, а другой рукой - полностью нивелировал его влияние в секции where (поскольку для результирующих строк, у которых справа - пусто, это условие никак не выполнится).

Вариант, который будет работать:
Код: plaintext
1.
2.
3.
4.
select к.Наименование, SUM(п.Сумма)
from Контрагенты к 
  left outer join Проводки п 
  on (к.Контрагент_ИД=п.Контрагент_ИД and п.СчетДебет='10' and п.СчетКредит='51')
group by к.Контрагент_ИД, к.Наименование

Вариант без слова JOIN (для T*SQL) требует применения подзапроса:
Код: plaintext
1.
2.
3.
4.
select к.Наименование, SUM(п.Сумма)
from Контрагенты к,
  (select * from Проводки where СчетДебет='10' and СчетКредит='51') п
where к.Контрагент_ИД *= п.Контрагент_ИД
group by к.Контрагент_ИД, к.Наименование

А теперь попробуйте все сказанное найти в вашей задаче.
...
Рейтинг: 0 / 0
24.07.2007, 15:53
    #34680604
pavellift
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
Я наверное чего то не понимаю

вот такой запрос ничего не выводит

Код: plaintext
1.
2.
3.
Select ct.phone, fax, email from vaccount a, contact ct
where acc='2600500004001'
 and  ct.idcustomer=a.idcustomer
group by ct.idcustomer, ct.phone, ct.fax, ct.email

а если я использую его в большом запросе говорит A subquery has returned not exactly one column
...
Рейтинг: 0 / 0
24.07.2007, 16:02
    #34680648
pavellift
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
простите не такой а вот такой запрос

Код: plaintext
1.
2.
3.
4.
Select ct.phone, fax, email from vaccount a
left outer join contact ct on a.idcustomer=ct.idcustomer
where acc='2600500004001'
 and  ct.idcustomer=a.idcustomer
group by ct.idcustomer, ct.phone, ct.fax, ct.email

но беда та же A subquery has returned not exactly one column
...
Рейтинг: 0 / 0
24.07.2007, 16:06
    #34680673
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
pavelliftЯ наверное чего то не понимаю

вот такой запрос ничего не выводит

Код: plaintext
1.
2.
3.
Select ct.phone, fax, email from vaccount a, contact ct
where acc='2600500004001'
 and  ct.idcustomer=a.idcustomer
group by ct.idcustomer, ct.phone, ct.fax, ct.email

а если я использую его в большом запросе говорит A subquery has returned not exactly one column
А Вот так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
select
a.full_name, a.short_name,
a.acc, a.codeokpo,
a.address,
ct.phone, ct.fax, ct.email from vaccount a Left Join contact ct on ct.idcustomer=a.idcustomer
where a.acc='2600500004001'
Это если убирать встроенный селект из приведенного Вами первого примера. То же самое делать и с остальными
...
Рейтинг: 0 / 0
24.07.2007, 16:38
    #34680824
pavellift
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
Фантастика. конечно тот запрос который вы мне написали он не заработал в виду того что вы не ори ентировались в табличках. вот трошки переделанный

Код: plaintext
1.
2.
3.
4.
5.
6.
select
c.full_name, c.short_name,
a.acc, c.codeokpo,
ad.address,
ct.phone, ct.fax, ct.email from address ad, customer c, vaccount a Left Join contact ct on ct.idcustomer=a.idcustomer
where a.acc='2600500004001'
 and  c.idcustomer=a.idcustomer

вот только теперь он мне все адреса вытягивает из таблички address
...
Рейтинг: 0 / 0
24.07.2007, 16:45
    #34680868
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
[quot pavellift]Фантастика. конечно тот запрос который вы мне написали он не заработал в виду того что вы не ори ентировались в табличках. вот трошки переделанный
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select
c.full_name, c.short_name,
a.acc, c.codeokpo,
ad.address,
ct.phone, ct.fax, ct.email from address ad, customer c, vaccount a Left Join contact ct on ct.idcustomer=a.idcustomer
Left join имя_таблицы ad on условие1  and  условие  2 
where a.acc='2600500004001'
 and  c.idcustomer=a.idcustomer
...
Рейтинг: 0 / 0
24.07.2007, 16:50
    #34680892
pavellift
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
Стало немного лучше но всё равно адресс не потянуло

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
distinct (c.full_name), c.short_name,
a.acc, c.codeokpo,
ad.address,
ct.phone, ct.fax, ct.email from  {address ad,}  customer c, vaccount a
Left Join contact ct on ct.idcustomer=a.idcustomer
left join address ad on ad.idcustomer=ct.idcustomer
where a.acc='2600500004001'
 and  c.idcustomer=a.idcustomer
-- and  a.idcustomer=ct.idcustomer
...
Рейтинг: 0 / 0
24.07.2007, 16:52
    #34680900
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
Для начала приучите себя не лениться, и всегда уточнять псевдонимом таблицу, из которой выбирается то или иное поле.
Кому здесь нужно ломать голову догадками, из какой таблицы вы выбираете acc, fax, mail и т.п. Неужели сложно писать a.acc, c.fax и т.п.?

pavelliftа если я использую его в большом запросе говорит A subquery has returned not exactly one column Ну и вы перевели это сообщение на русский язык? Он достаточно понятно говорит вам, какие ограничения имеют подзапросы, выполняемые в SELECT-кляузе.
...
Рейтинг: 0 / 0
24.07.2007, 16:55
    #34680912
pavellift
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
с тем моментом я разобрался а по поводу уточнения псевдонимов прошу прощения. по неопытности.
...
Рейтинг: 0 / 0
24.07.2007, 17:01
    #34680941
pavellift
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
самое интересное что этот запрос тянет пустое поле address

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
distinct (c.full_name), c.short_name,
a.acc, c.codeokpo,
address,
ct.phone, ct.fax, ct.email from  {address ad,}  customer c, vaccount a
Left Join contact ct on ct.idcustomer=a.idcustomer
left join address ad on ad.idcustomer=ct.idcustomer
where a.acc='2600500004001'
 and  c.idcustomer=a.idcustomer
-- and  a.idcustomer=ct.idcustomer
...
Рейтинг: 0 / 0
24.07.2007, 17:08
    #34680982
Gerasimenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
distinct (c.full_name), c.short_name,
a.acc, c.codeokpo,
address,
ct.phone, ct.fax, ct.email from  {address ad,}  customer c, vaccount a
Left Join contact ct on ct.idcustomer=a.idcustomer
left join address ad on ad.idcustomer=a.idcustomer
where a.acc='2600500004001'
 and  c.idcustomer=a.idcustomer

...
Рейтинг: 0 / 0
24.07.2007, 17:13
    #34681007
A.K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много вопросов по запросу
pavelliftсамое интересное что этот запрос тянет пустое поле address...
И что? Что пишете, то и тянется.

ЗЫ: Я бы не рекомендовал миксовать в одном запросе соединения через JOIN и соединения через WHERE conditions - запутаете всех, прежде всего себя. Если используете {INNER | {LEFT | RIGHT} OUTER} JOIN, то в WHERE оставляйте только условия ФИЛЬТРАЦИИ.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Много вопросов по запросу / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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