Форум: "Базы";
Текущий архив: 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.044 c