Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

Выборка с учётом не существования записей   Найти похожие ветки 

 
yk ©   (2005-05-20 09:45) [0]

Уважаемые Мастера!
Помогите пожалуйста с составлением запроса.

Есть:

Табл1(
ИДтабл1
название
.....
)

Табл2(
ИДтабл1,
ИДтабл2, FK на табл1
количество
....
)

Мне нужно составить выборку из Таблицы1(ИДтабл1, название) и
Таблицы2(ИДтабл2, количество)
ПРИЧЕМ!
Если в табл1 есть запись с табл1.ИДтабл2=Табл2.ИДтабл2
то количество берется из Табл1
Если такой записи нет, то количество берётся равным 0

Наверное кто-нибудь сталкивался с подобной ситуацией, подскажите, что делать в таких случаях. Плиз !


 
Johnmen ©   (2005-05-20 10:06) [1]

>то количество берется из Табл1

Количество чего ?


 
Lexer ©   (2005-05-20 10:13) [2]

yk ©   (20.05.05 09:45)
Так и не понял что тебе надо, может это?
SELECT
T1.id_tabl1,
T1.название,
COALESCE(T2.количество,0)
FROM Табл1 T1
LEFT JOIN Табл2 T2
ON T2.id_table2 = T1.id_table1


 
yk ©   (2005-05-20 11:00) [3]


> Количество чего ?

"количество" - название поля


 
yk ©   (2005-05-20 11:04) [4]


> Lexer ©   (20.05.05 10:13) [2]

Что такое COALESCE

Такого в IB нет :(


 
lexer ©   (2005-05-20 11:09) [5]

как, разве в 6 нет? это на жарптице 1.5 означает: если NULL то какое-то значение, в данном примере - 0


 
yk ©   (2005-05-20 11:12) [6]

:( нет только что попробовала
У меня не 6, а 7


 
lexer ©   (2005-05-20 11:13) [7]

тогда используй CASE, кажись в 7 есть, точно не знаю...


 
yk ©   (2005-05-20 11:17) [8]

:( нету :(


 
P.N.P. ©   (2005-05-20 11:20) [9]

>yk ©   (20.05.05 11:17) [8]
Можно еще и процедурку организовать.


 
yk ©   (2005-05-20 11:24) [10]


> P.N.P. ©   (20.05.05 11:20) [9]
> Можно еще и процедурку организовать.

Которая проверяет, есть ли запись и выдает значение поля или 0 ?

Но тогда проще мне в программе организовывать выборки для каждого выбранного поля Табл1 для поиска его количества.

По-моему не намного хуже будет.


 
Johnmen ©   (2005-05-20 11:27) [11]

>"количество" - название поля
и
>то количество берется из Табл1

Я чего-то пропустил ?
:)


 
lexer ©   (2005-05-20 11:36) [12]

Можно и без процедуры и без COALESCE и CASE
SELECT
T1.id_tabl1,
T1.название,
CAST(T2.количество AS NUMERIC) количество
FROM Табл1 T1
LEFT JOIN Табл2 T2
ON T2.id_table2 = T1.id_table1
WHERE T2.количество IS NOT NULL
UNION
SELECT
T1.id_tabl1,
T1.название,
CAST(0 AS NUMERIC) количество
FROM Табл1 T1
LEFT JOIN Табл2 T2
ON T2.id_table2 = T1.id_table1
WHERE T2.количество IS NULL


 
yk ©   (2005-05-20 11:41) [13]


> Я чего-то пропустил ?

Ой! Это я попутала, конечно "количество" из Табл2  :)


> lexer ©   (20.05.05 11:36) [12]


Сейчас попробую, но меня терзают смутные сомненья....


 
P.N.P. ©   (2005-05-20 11:50) [14]

В IB7.5 CASE и COALESCE есть.


 
YK ©   (2005-05-22 15:01) [15]

У меня 7.1
И нету их :((


 
P.N.P. ©   (2005-05-22 16:07) [16]

>YK ©   (22.05.05 15:01) [15]
Ну так обнови до 7.5, что ли :)


 
yk ©   (2005-05-23 08:07) [17]

8)

Эти количества я загнала в вьюшку пока.

Теперь такая проблема:
У меня сложный запрос на выборку товаров (со всякими разными нехорошими условиями).

Я хочу его left join с вьюшкой количеств.
Тогда получиться то что надо.

Вопрос как можно сочетать результат сложного запроса с join ?
(получиться ведь смешивания явных и неявных join ...)


 
ЮЮ ©   (2005-05-23 08:18) [18]

>Вопрос как можно сочетать результат сложного запроса с join ?
(получиться ведь смешивания явных и неявных join ...)

Привыкать к явному использованию JOIN, IMHO. Когда разгрузишь WHERE от условий связи, тогда и запрос не будет выглядеть таким уж сложным, а условия не будут казаться нехорошими :)


 
yk ©   (2005-05-23 08:28) [19]

К сожалению на этот запрос не получается повесить явный join
В нем используются sum, результаты работы процедур, условие exists
:(

хотя может я чего-то не то делаю 8)

А какие могут быть ограничения на использование join?


 
ЮЮ ©   (2005-05-23 08:59) [20]

>К сожалению на этот запрос не получается повесить явный join
В нем используются sum, результаты работы процедур, условие exists

Какая разница, что в нем используется?
Что мешает привести твой
FROM
 TableName, ProcedureName, ...
WHERE
 TableName.Ref1_1 = ProcedureName.Ref1_2
к виду

FROM
 TableName
 JOIN ProcedureName ON TableName.Ref1_1 = ProcedureName.Ref1_2
 ...
куда и добавить
 LEFT JOIN ViewName ON xxx.RefN_1 = ViewName.RefN_2


 
yk ©   (2005-05-23 09:32) [21]

мешает exists

FROM
TableName, ProcedureName, ...
WHERE
TableName.Ref1_1 = ProcedureName.Ref1_2
and
not(exists(select * from Table_2 where  Table_2.id=TableName.Id))

Как его можно добавить к
> FROM
>  TableName
>  JOIN ProcedureName ON TableName.Ref1_1 = ProcedureName.Ref1_2


 
Johnmen ©   (2005-05-23 09:35) [22]

FROM
TableName
JOIN ProcedureName ON TableName.Ref1_1 = ProcedureName.Ref1_2
LEFT JOIN Table_2 ON Table_2.id=TableName.Id
WHERE Table_2.id IS NULL


 
yk ©   (2005-05-23 09:43) [23]

Спасибо
> Johnmen ©  

теперь надо присобачить

> LEFT JOIN ViewName ON xxx.RefN_1 = ViewName.RefN_2


 
yk ©   (2005-05-23 09:55) [24]

делаю так:

FROM
ViewName rigth join TableName ON xxx.RefN_1 = ViewName.RefN_2
JOIN ProcedureName ON TableName.Ref1_1 = ProcedureName.Ref1_2
LEFT JOIN Table_2 ON Table_2.id=TableName.Id
WHERE Table_2.id IS NULL

Выдаёт ошибку
invalid column reference  
когда перед FROM пишу поля из ViewName

Странно....
Если поля не пишу, то выбирает (вроде правильно, но без поле вьюшки непонятно правильно или не совсем )


 
Johnmen ©   (2005-05-23 09:58) [25]

>когда перед FROM пишу поля из ViewName

Что-то не видно этого в [24]


 
yk ©   (2005-05-23 10:03) [26]

Сорри 8)

select
 TableName.id as ID ,
 TableName.OBOZNACH as OBOZNACH,
 TableName.NAIMENOVAN as NAIMENOVAN,
 sum(procedureName.count) as CountS,
 ViewName.price as price,
 ViewName.docdate as docdate
FROM
ViewName
rigth join
TableName ON xxx.RefN_1 = ViewName.RefN_2
JOIN ProcedureName ON TableName.Ref1_1 = ProcedureName.Ref1_2
LEFT JOIN Table_2 ON Table_2.id=TableName.Id
WHERE Table_2.id IS NULL
Group by   NAIMENOVAN, OBOZNACH,TableName.id
 order by NAIMENOVAN

Вот так...


 
Johnmen ©   (2005-05-23 10:10) [27]

Вот здесь procedureName.count
Давать какие-либо имена своим объектам, совпадающие с зарезервированными словами, есть большая ошибка...


 
yk ©   (2005-05-23 10:19) [28]

ой ! Это очепятка
там counts

select
TableName.id as ID ,
TableName.OBOZNACH as OBOZNACH,
TableName.NAIMENOVAN as NAIMENOVAN,
sum(procedureName.counts) as CountS,
ViewName.price as price,
ViewName.docdate as docdate
FROM
ViewName
rigth join
TableName ON xxx.RefN_1 = ViewName.RefN_2
JOIN ProcedureName ON TableName.Ref1_1 = ProcedureName.Ref1_2
LEFT JOIN Table_2 ON Table_2.id=TableName.Id
WHERE Table_2.id IS NULL
Group by   NAIMENOVAN, OBOZNACH,TableName.id
order by NAIMENOVAN

извините за очепятку 8)

По каким причинам обычно выскакивает invalid column reference
Ведь у меня все поля правильно (теперь) написаны ?

Может дело в порядке join-ов ?? 8(
С group by это вроде не связано (убирала group by - всё то же)


 
ЮЮ ©   (2005-05-23 10:35) [29]

Может дело все-таки в названии полей вьюшки?
Попробуй для начала
select
 TableName.id as ID ,
 TableName.OBOZNACH as OBOZNACH,
 TableName.NAIMENOVAN as NAIMENOVAN,
 sum(procedureName.counts) as CountS,
 ViewName.*
FROM


 
Johnmen ©   (2005-05-23 10:38) [30]

Тогда здесь
Group by   NAIMENOVAN, OBOZNACH,TableName.id
order by NAIMENOVAN


1. Такая группировка не пройдёт.
2. Нельзя указывать в группировке и сортировке алиасы полей.


 
yk ©   (2005-05-23 10:43) [31]

Или всё-таки из-за group by ?

он теперь относиться ко всему (итоговой выборке)
или только к Table_2

Всё-таки без group by работает ...


 
Johnmen ©   (2005-05-23 10:46) [32]

GROUP BY col [, col …] Partitions the results of a query into groups containing all rows with identical values based on a column list


 
yk ©   (2005-05-23 10:48) [33]


> 2. Нельзя указывать в группировке и сортировке алиасы полей.

Странно, но работает
 order by naimenovan

Группировка действительно никакая не проходит,
но в моем случае вполне можно обойтись
order by naimenovan, oboznachen


 
ЮЮ ©   (2005-05-23 10:48) [34]

>он теперь относиться ко всему (итоговой выборке)

Естественно, т.е. вместо ViewName.price надо или ставить
MIN(ViewName.price) As Price  
или всключать ViewName.price в поля группировки


 
yk ©   (2005-05-23 10:52) [35]


> 2. Нельзя указывать в группировке и сортировке алиасы полей.

ваша правда! Просто у меня алиасы с именами полей совпадали 8)


 
yk ©   (2005-05-23 10:53) [36]


> Естественно, т.е. вместо ViewName.price надо или ставить
>
> MIN(ViewName.price) As Price  
> или всключать ViewName.price в поля группировки


А хоть тресни, всё равно не хочет делать group by :)


 
yk ©   (2005-05-23 10:56) [37]

Johnmen , lexer, P.N.P., ЮЮ
Я вас всех ОЧЕНЬ люблю!
Что бы я без Вас делала!

БОЛЬШОЕ, ОГРОМЕДНОЕ ВАМ СПАСИБИЩЕ!

И главное, я кажеться больше стала понимать в sql :)


 
ЮЮ ©   (2005-05-23 10:57) [38]

>но в моем случае вполне можно обойтись order by

а как же тогда sum(procedureName.counts)

>А хоть тресни, всё равно не хочет делать group by :)

Для начала приведи окончательный запрос, причём реальный :)


 
yk ©   (2005-05-23 11:11) [39]

А выяснилось, что тут мне не нужен

> sum(procedureName.counts)

:)


 
yk ©   (2005-05-23 11:27) [40]

Форумы - замечательная вещь, а то так бы и росла дурочкой :)



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.049 c
9-1111675437
-=SS=-
2005-03-24 17:43
2005.06.29
Загрузка процессора GlScene


6-1111569342
TankMan
2005-03-23 12:15
2005.06.29
Не понимаю - почему ошибка при копировании через ClientSocket?:(


3-1115878600
leonidus
2005-05-12 10:16
2005.06.29
Глюк базы dBase если поле пустое


3-1116574168
Hereticsoul
2005-05-20 11:29
2005.06.29
Sqlite+Delphi


3-1115984454
tema
2005-05-13 15:40
2005.06.29
Поиск без locate





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский