powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку по условию - все значения, а не хотя бы одно
10 сообщений из 10, страница 1 из 1
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817174
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица ( ID int, MainID int, DocTypeID int, DocNum varchar(50)) - как получить все MainID, у которых DocTypeID равен всем указанным значениям. Например: 7 и 8; результат MainID = 1. MainID = 2 не подходит, так как нет записей с DocTypeID = 8. Спасибо.
IDMainIDDocTypeIDDocNum1 1 7 N 10242 1 8 N 10253 1 8 N 10264 2 7 N 1027
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817180
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

Считайте про реляционное деление. Простейшая реализация - на [not]exists-подзапросах, либо на группировке с последующей фильтрацией (group by + having)
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817240
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаQwe.Qwe1,
Читайте про реляционное деление.

Простейшая реализация
Код: sql
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.
IF OBJECT_ID( 'tempdb..#t' ) IS NOT NULL
  DROP TABLE #t
;
CREATE TABLE #t ( [ID] INT, [MainID] INT, [DocTypeID] INT, [DocNum] VARCHAR(50) )
;
INSERT INTO #t
VALUES
( 1, 1, 7, 'N 1024' ),
( 2, 1, 8, 'N 1025' ),
( 3, 1, 8, 'N 1026' ),
( 4, 2, 7, 'N 1027' )
;
SELECT
  [MainID]
FROM
  #t
WHERE
  [DocTypeID] IN ( 7,8 )
GROUP BY
  [MainID]
HAVING
  COUNT( DISTINCT [DocTypeID] ) = 2
;
IF OBJECT_ID( 'tempdb..#t' ) IS NOT NULL
  DROP TABLE #t
;
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817248
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня типы "7,8" - это динамически параметр, поэтому, видимо, с группировкой вариант не подойдет (или придется считать количество передаваемых значений).

Сделал так, поправьте, если можно оптимизировать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
Select Distinct MainID From dbo.Documents D 
Where DocTypeID = All
(
Select DocTypeID From dbo.Documents Where DocTypeID In(7,8)
Except
Select DocTypeID From dbo.Documents DD Where D.MainID = DD.MainID And DocTypeID In(7,8)
)



Есть еще такой вариант, но не пойму, как ограничить множество типов на нужные мне в данном примере "7,8"?
("Не должно существовать такого типа документа, которого бы не было у искомого")
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Select Distinct MainID From dbo.Documents D 
Where Not Exists
(
    Select DocTypeID From dbo.Documents Where DocTypeID Not In
    (
        Select DocTypeID From dbo.Documents DD Where D.MainID = DD.MainID
    )
)
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817258
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

вы в курсе, что будет, если подзапрос в первом варианте не вернёт ни одной записи?
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817261
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему бы сначала не определить число уникальных DocTypeID,
а потом не сгруппировать по уникальным MainID + DocTypeID
с последующим фильтром по числу уникальных DocTypeID,
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817264
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 iap, а как это вариант переделать? Да, сейчас он не корректно работает...
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817284
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,
Сделать можно подумав. Чем больше думаешь, тем лучше решение.
Код: sql
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.
60.
61.
62.
63.
64.
65.
66.
67.
IF OBJECT_ID( 'tempdb..#t' ) IS NOT NULL
  DROP TABLE #t
;
IF OBJECT_ID( 'tempdb..#g' ) IS NOT NULL
  DROP TABLE #g
;
CREATE TABLE #g ( [DocTypeID] INT )
INSERT INTO #g
VALUES
  ( 7 ),
  ( 8 )
;
CREATE TABLE #t ( [ID] INT, [MainID] INT, [DocTypeID] INT, [DocNum] VARCHAR(50) )
;
INSERT INTO #t
VALUES
( 1, 1, 7, 'N 1024' ),
( 2, 1, 8, 'N 1025' ),
( 3, 1, 8, 'N 1026' ),
( 4, 2, 7, 'N 1027' )
;
/* Ex1 */
WITH
g AS (
  SELECT
    [count] = COUNT(*)
  FROM
    #g
),
t AS (
  SELECT
    t.[MainID],
    [count] = COUNT( DISTINCT t.[DocTypeID] )
  FROM
    #g g
    INNER JOIN #t t ON (
          t.[DocTypeID] = g.[DocTypeID] )
  GROUP BY
    t.[MainID]
)
SELECT
  t.[MainID]
FROM
  g
  INNER JOIN t ON (
        t.[count] = g.[count] )
;
/* Ex2 */
DECLARE @cnt INT = ( SELECT COUNT(*) FROM #g )
;
SELECT
  t.[MainID]
FROM
  #g g
  INNER JOIN #t t ON (
        t.[DocTypeID] = g.[DocTypeID] )
GROUP BY
  t.[MainID]
HAVING
  COUNT( DISTINCT t.[DocTypeID] ) = @cnt
;
IF OBJECT_ID( 'tempdb..#t' ) IS NOT NULL
  DROP TABLE #t
;
IF OBJECT_ID( 'tempdb..#g' ) IS NOT NULL
  DROP TABLE #g
;
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817287
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT 
	MainId,
	COUNT(DISTINCT DocTypeID ) 
FROM #t 
GROUP BY MainId
HAVING 
	COUNT(DISTINCT DocTypeID )  = 
			(
				SELECT COUNT(DISTINCT DocTypeID)
				FROM #t
			)
...
Рейтинг: 0 / 0
Запрос на выборку по условию - все значения, а не хотя бы одно
    #39817614
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку по условию - все значения, а не хотя бы одно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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