SQL - Выбрать записи
От: Аноним  
Дата: 24.08.06 04:07
Оценка:
Добрый день!

Есть таблица, в ней числовое поле — назовем его Kod, задача — составить такой SQL запрос, чтобы в результирующем наборе остались только записи с такими значениями Kod, которые встречаются, скажем > 2 раз в таблице?

Например, есть две таблицы, связанные как Мастер-Детаил через поле Kod, назовем эти таблицы Master и Detail. Например:
---
Master:
  | Id  | Name |
  |  0  | Abba |
  |  1  | Abbc |
  |  2  | Abbd |
   .............

Detail:
  | Id  | MId  |
  |  0  |   1  |
  |  1  |   1  |
  |  2  |   0  |
  |  3  |   0  |
  |  4  |   1  |
  |  5  |   0  |
  |  6  |   2  |
   .............


В таблице Detail записи 0,1,4 имеют MId = 1, поскольку таких записей 3 они должны попасть в результирующий набор. И записи 2,3,5 имеют MId = 0, поэтому они тоже должны помасть в результат. Тогда как запись 6 только одна, поэтому она в результат попасть не должна.

Подскажите как это реализовать.. Таблицы Paradox, работаю через BDE/Delphi6.
Re: SQL - Выбрать записи
От: Demon Россия  
Дата: 24.08.06 05:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть таблица, в ней числовое поле — назовем его Kod, задача — составить такой SQL запрос, чтобы в результирующем наборе остались только записи с такими значениями Kod, которые встречаются, скажем > 2 раз в таблице?


А>Detail:

А> | Id | MId |
А> | 0 | 1 |
А> | 1 | 1 |
А> | 2 | 0 |
А> | 3 | 0 |
А> | 4 | 1 |
А> | 5 | 0 |
А> | 6 | 2 |
А> .............
А>[/code]


SELECT T1.*, T2.cnt 
FROM Detail AS T1
JOIN
(
  SELECT MId, count(*) AS cnt
  FROM Detail
  GROUP BY MId
) T2
ON T1.MId = T2.MId
WHERE T2.cnt > 2;


А>Подскажите как это реализовать.. Таблицы Paradox, работаю через BDE/Delphi6.

В MS SQL 2005 проверял.
Re[2]: SQL - Выбрать записи
От: FunnyRabbit Россия  
Дата: 24.08.06 06:19
Оценка:
Здравствуйте, 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;
То что меня не убивает, делает меня умнее.
Re[3]: SQL - Выбрать записи
От: Demon Россия  
Дата: 24.08.06 06:40
Оценка:
Здравствуйте, FunnyRabbit, Вы писали:


А>>>Есть таблица, в ней числовое поле — назовем его 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;


Есть подозрение (проверять лень) что на скорости выполнения это никак не скажется.
Re[4]: SQL - Выбрать записи
От: Lloyd Россия  
Дата: 24.08.06 08:23
Оценка:
Здравствуйте, Demon, Вы писали:

D>Есть подозрение (проверять лень) что на скорости выполнения это никак не скажется.


Ребят, а вы первоначальное сообщение-то читали?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: SQL - Выбрать записи
От: DuШes  
Дата: 24.08.06 08:34
Оценка:
Здравствуйте, Аноним, Вы писали:
[...]

боюсь, что 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

Re[2]: SQL - Выбрать записи
От: Lloyd Россия  
Дата: 24.08.06 08:39
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Здравствуйте, Аноним, Вы писали:

DШ>[...]

DШ>боюсь, что Lloyd щас скажет что я невнимательно прочитал , но насколько я понял, нужно получить результат чтото типа этого:


К бабке не ходи. Конечно неправильно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: SQL - Выбрать записи
От: FunnyRabbit Россия  
Дата: 24.08.06 08:46
Оценка: :)))
Здравствуйте, Аноним, Вы писали:

Слышь Аноним, поддерживает твой Paradox подзапросы?
То что меня не убивает, делает меня умнее.
Re[3]: SQL - Выбрать записи
От: DuШes  
Дата: 24.08.06 09:00
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, DuШes, Вы писали:


DШ>>Здравствуйте, Аноним, Вы писали:

DШ>>[...]

DШ>>боюсь, что Lloyd щас скажет что я невнимательно прочитал , но насколько я понял, нужно получить результат чтото типа этого:


L>К бабке не ходи. Конечно неправильно.


мля...точна ведь...нужен paradox
Re: SQL - Выбрать записи
От: vl.v  
Дата: 24.08.06 09:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день!

А>Таблицы Paradox, работаю через BDE/Delphi6.

Может так?
select * from Detail d1
where exists (select * from Detail d2 where d1.MId = d2.MId having count(*) > 2)
Re: SQL - Выбрать записи
От: Wyfinger  
Дата: 24.08.06 09:13
Оценка:
Здравствуйте, Все!

Большое спасибо за ответы, завтра проверю на работе.

P.S. Не думал что развернется такая дискуссия..
Re[2]: SQL - Выбрать записи
От: FunnyRabbit Россия  
Дата: 24.08.06 09:18
Оценка:
Здравствуйте, Wyfinger, Вы писали:

W>Здравствуйте, Все!


W>Большое спасибо за ответы, завтра проверю на работе.


W>P.S. Не думал что развернется такая дискуссия..


Не. Ты мне скажи. Поддерживает Парадокс подзапросы или нет?
То что меня не убивает, делает меня умнее.
Re[3]: SQL - Выбрать записи
От: _rasta  
Дата: 24.08.06 09:32
Оценка: +1 :)
Здравствуйте, FunnyRabbit, Вы писали:

W>>P.S. Не думал что развернется такая дискуссия..

FR>Не. Ты мне скажи. Поддерживает Парадокс подзапросы или нет?

ну блин, уже даже мне интересно, поддерживает подзапросы или нет...

руки так и чешутся наставить минусов и плюсов, вот только кому?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: SQL - Выбрать записи
От: FunnyRabbit Россия  
Дата: 24.08.06 09:34
Оценка:
Здравствуйте, _rasta, Вы писали:

_>Здравствуйте, FunnyRabbit, Вы писали:


W>>>P.S. Не думал что развернется такая дискуссия..

FR>>Не. Ты мне скажи. Поддерживает Парадокс подзапросы или нет?

_>ну блин, уже даже мне интересно, поддерживает подзапросы или нет...


_>руки так и чешутся наставить минусов и плюсов, вот только кому?


А я уже начал. С тебя.
То что меня не убивает, делает меня умнее.
Re[2]: SQL - Выбрать записи
От: vl.v  
Дата: 24.08.06 09:36
Оценка:
Здравствуйте, Wyfinger, Вы писали:

W>Здравствуйте, Все!


W>Большое спасибо за ответы, завтра проверю на работе.


А сегодня почему не на работе-то?
Вроде четверг.
Re[5]: SQL - Выбрать записи
От: Demon Россия  
Дата: 24.08.06 09:36
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Ребят, а вы первоначальное сообщение-то читали?


Тааак. Теперь и я попал под раздачу.
К чему претензии то?
К тому что нужен парадокс? Позволю себе не согласится с данной позицией. На текущий момент уже предложено несколько вариантов. Возможно ни один из них не будет работать на парадоксе, а возможно и будет. А если бы все авторы говорили "у меня нет парадокса, проверить не начем, не буду отвечать" ответов было бы 0.
Внимание, вопрос. Что лучше?

Еще вопрос. Если Wyfinger изначальный аноним, то кому он сказал спасибо? Нам, которые предложили варианты, или тебе, который говорит, что все ответы г...о?
Re[6]: SQL - Выбрать записи
От: Lloyd Россия  
Дата: 24.08.06 09:43
Оценка:
Здравствуйте, Demon, Вы писали:

L>>Ребят, а вы первоначальное сообщение-то читали?


D>Тааак. Теперь и я попал под раздачу.

D>К чему претензии то?

Просто прочитай внимательно первоначальное сообщение.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: SQL - Выбрать записи
От: Аноним  
Дата: 24.08.06 09:50
Оценка:
Здравствуйте, vl.v, Вы писали:

VV>А сегодня почему не на работе-то?

VV>Вроде четверг.

День Незалежности Укрины...
Re: SQL - Выбрать записи
От: Demon Россия  
Дата: 24.08.06 09:54
Оценка:
Здравствуйте, Аноним, Вы писали:

Дабы прекратить споры на тему парадокса и вложенных запросов вот вариант без них.
SELECT t1.Id, t1.MId, count(*) AS cnt
FROM Detail AS t1
JOIN Detail AS t2
ON t1.MId = t2.MId
GROUP BY t1.Id, t1.MId
HAVING count(*)>=2;
Re[2]: SQL - Выбрать записи
От: Lloyd Россия  
Дата: 24.08.06 10:05
Оценка:
Здравствуйте, Demon, Вы писали:

D>Дабы прекратить споры на тему парадокса и вложенных запросов вот вариант без них.

D>
D>SELECT t1.*
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>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.