Есть таблица, в ней числовое поле — назовем его Kod, задача — составить такой SQL запрос, чтобы в результирующем наборе остались только записи с такими значениями Kod, которые встречаются, скажем > 2 раз в таблице?
Например, есть две таблицы, связанные как Мастер-Детаил через поле Kod, назовем эти таблицы Master и Detail. Например:
---
В таблице Detail записи 0,1,4 имеют MId = 1, поскольку таких записей 3 они должны попасть в результирующий набор. И записи 2,3,5 имеют MId = 0, поэтому они тоже должны помасть в результат. Тогда как запись 6 только одна, поэтому она в результат попасть не должна.
Подскажите как это реализовать.. Таблицы Paradox, работаю через BDE/Delphi6.
Здравствуйте, Demon, Вы писали:
D>Здравствуйте, Аноним, Вы писали:
А>>Есть таблица, в ней числовое поле — назовем его Kod, задача — составить такой SQL запрос, чтобы в результирующем наборе остались только записи с такими значениями Kod, которые встречаются, скажем > 2 раз в таблице?
А>>Detail: А>> | Id | MId | А>> | 0 | 1 | А>> | 1 | 1 | А>> | 2 | 0 | А>> | 3 | 0 | А>> | 4 | 1 | А>> | 5 | 0 | А>> | 6 | 2 | А>> ............. А>>[/code]
D>
D>SELECT T1.*, T2.cnt
D>FROM Detail AS T1
D>JOIN
D>(
D> SELECT MId, count(*) AS cnt
D> FROM Detail
D> GROUP BY MId
D>) T2
D>ON T1.MId = T2.MId
D>WHERE T2.cnt > 2;
D>
А>>Подскажите как это реализовать.. Таблицы Paradox, работаю через BDE/Delphi6. D>В MS SQL 2005 проверял.
А разве в MSSQL нет HAVING?
SELECT mid, COUNT (*) AS cnt
FROM detail
GROUP BY mid
HAVING COUNT (*) > 2;
А>>>Есть таблица, в ней числовое поле — назовем его Kod, задача — составить такой SQL запрос, чтобы в результирующем наборе остались только записи с такими значениями Kod, которые встречаются, скажем > 2 раз в таблице?
FR>А разве в MSSQL нет HAVING?
Есть, но разница получается небольшая.
SELECT T1.*, T2.cnt
FROM Detail AS T1
JOIN
(
SELECT MId, count(*) AS cnt
FROM Detail
GROUP BY MId
HAVING count(*) > 2
) T2
ON T1.MId = T2.MId;
Есть подозрение (проверять лень) что на скорости выполнения это никак не скажется.
боюсь, что Lloyd щас скажет что я невнимательно прочитал , но насколько я понял, нужно получить результат чтото типа этого:
create table #table ( kod int,
name nvarchar(10)
)
insert into #table
select 1, 'test 1'
union all
select 1, 'test 1'
union all
select 1, 'test 1'
union all
select 2, 'test 2'
union all
select 3, 'test 3'
union all
select 3, 'test 3'
union all
select 3, 'test 3'
select *
from #table leftJoinTable
right join ( select kod
from #table
group by kod
having count(*) > 2
) rightJoinTable on rightJoinTable.kod = leftJoinTable.kod
drop table #table
1 test 1 1
1 test 1 1
1 test 1 1
3 test 3 3
3 test 3 3
3 test 3 3
Здравствуйте, DuШes, Вы писали:
DШ>Здравствуйте, Аноним, Вы писали: DШ>[...]
DШ>боюсь, что Lloyd щас скажет что я невнимательно прочитал , но насколько я понял, нужно получить результат чтото типа этого:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, DuШes, Вы писали:
DШ>>Здравствуйте, Аноним, Вы писали: DШ>>[...]
DШ>>боюсь, что Lloyd щас скажет что я невнимательно прочитал , но насколько я понял, нужно получить результат чтото типа этого:
L>К бабке не ходи. Конечно неправильно.
Здравствуйте, Wyfinger, Вы писали:
W>Здравствуйте, Все!
W>Большое спасибо за ответы, завтра проверю на работе.
W>P.S. Не думал что развернется такая дискуссия..
Не. Ты мне скажи. Поддерживает Парадокс подзапросы или нет?
Здравствуйте, FunnyRabbit, Вы писали:
W>>P.S. Не думал что развернется такая дискуссия.. FR>Не. Ты мне скажи. Поддерживает Парадокс подзапросы или нет?
ну блин, уже даже мне интересно, поддерживает подзапросы или нет...
руки так и чешутся наставить минусов и плюсов, вот только кому?
Здравствуйте, _rasta, Вы писали:
_>Здравствуйте, FunnyRabbit, Вы писали:
W>>>P.S. Не думал что развернется такая дискуссия.. FR>>Не. Ты мне скажи. Поддерживает Парадокс подзапросы или нет?
_>ну блин, уже даже мне интересно, поддерживает подзапросы или нет...
_>руки так и чешутся наставить минусов и плюсов, вот только кому?
Здравствуйте, Lloyd, Вы писали:
L>Ребят, а вы первоначальное сообщение-то читали?
Тааак. Теперь и я попал под раздачу.
К чему претензии то?
К тому что нужен парадокс? Позволю себе не согласится с данной позицией. На текущий момент уже предложено несколько вариантов. Возможно ни один из них не будет работать на парадоксе, а возможно и будет. А если бы все авторы говорили "у меня нет парадокса, проверить не начем, не буду отвечать" ответов было бы 0.
Внимание, вопрос. Что лучше?
Еще вопрос. Если Wyfinger изначальный аноним, то кому он сказал спасибо? Нам, которые предложили варианты, или тебе, который говорит, что все ответы г...о?
Здравствуйте, Demon, Вы писали:
D>Дабы прекратить споры на тему парадокса и вложенных запросов вот вариант без них. D>
D>SELECTt1.*
D>FROM Detail AS t1
D>JOIN Detail AS t2
D>ON t1.MId = t2.MId
D>GROUP BY t1.Id, t1.MId
D>HAVING count(*)>=2;
D>
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: SQL - Выбрать записи
От:
Аноним
Дата:
24.08.06 21:03
Оценка:
Здравствуйте, FunnyRabbit, Вы писали:
FR>Здравствуйте, Аноним, Вы писали:
FR>Слышь Аноним, поддерживает твой Paradox подзапросы?
Похоже что нет. Я работаю c BDE/Delphi. Какие есть варианты без подзапросов?
P.S. Странно, я думал это довольно частовстречающаяся задача и должны быть наработаны готовые решения.
P.P.S. Я Wyfinger, просто пишу с работы.
Re[3]: SQL - Выбрать записи
От:
Аноним
Дата:
24.08.06 21:09
Оценка:
Здравствуйте, vl.v, Вы писали:
VV>Здравствуйте, Wyfinger, Вы писали:
W>>Здравствуйте, Все!
W>>Большое спасибо за ответы, завтра проверю на работе.
VV>А сегодня почему не на работе-то? VV>Вроде четверг.
Не знаю как у Вас, а я заканчиваю работать в 6^00, просто день у меня начинается на 9 часов раньше чем в Москве.
Re[3]: SQL - Выбрать записи
От:
Аноним
Дата:
24.08.06 21:18
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Demon, Вы писали:
D>>Дабы прекратить споры на тему парадокса и вложенных запросов вот вариант без них. D>>
D>>SELECTt1.*
D>>FROM Detail AS t1
D>>JOIN Detail AS t2
D>>ON t1.MId = t2.MId
D>>GROUP BY t1.Id, t1.MId
D>>HAVING count(*)>=2;
D>>
Огромное спачибо!, Это решение работает.
Только Вы не могли бы объяснить, почему если написать в первой строке:
SELECT t1.*, count(*) AS cnt
Выдается сообщение:
When GROUP BY exists, every simple field in projectors must be in GROUP BY.
Что оно означает? Что значит every simple field? Получается в GROUP BY нужно перечислить все поля, физически содержащиеся в таблице?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Lloyd, Вы писали:
L>>Здравствуйте, Demon, Вы писали:
D>>>Дабы прекратить споры на тему парадокса и вложенных запросов вот вариант без них. D>>>
D>>>SELECTt1.*
D>>>FROM Detail AS t1
D>>>JOIN Detail AS t2
D>>>ON t1.MId = t2.MId
D>>>GROUP BY t1.Id, t1.MId
D>>>HAVING count(*)>=2;
D>>>
А>Огромное спачибо!, Это решение работает.
А>Только Вы не могли бы объяснить, почему если написать в первой строке: А>
SELECT t1.*, count(*) AS cnt
А>Выдается сообщение: А>
When GROUP BY exists, every simple field in projectors must be in GROUP BY.
А>Что оно означает? Что значит every simple field? Получается в GROUP BY нужно перечислить все поля, физически содержащиеся в таблице?
Здравствуйте, Аноним, Вы писали:
А>Выдается сообщение: А>
When GROUP BY exists, every simple field in projectors must be in GROUP BY.
А>Что оно означает? Что значит every simple field?
Означает, что список неагрегатных полей в секции select должен совпадать со списком полей в секции group by.
А>Получается в GROUP BY нужно перечислить все поля, физически содержащиеся в таблице?
Здравствуйте, FunnyRabbit & Lloyd & все, все, все... Вы много чего писали :
1. Завязывайте с разборками, здесь все-таки технический форум, а не филиал курилки.
2. Избыточное цитирование крайне не приветствуется, игнорирование этого предупреждения награждается профилактическим баном.
3. 2 FunnyRabbit, если не хочешь/не можешь/не умеешь отвечать развернуто, то лучше вообще себя не утруждай, особенно если вопрос не относится к Ораклу.
4. 2 Lloyd, то же самое, если тебя не устраивает качество ответа оппонента, тогда сразу поясняй, что тебя не устраивает, а не начинай игру в угадайку.
Все обсуждения вопросов модерирования на moderator@rsdn.ru