Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку по условию - все значения, а не хотя бы одно / 10 сообщений из 10, страница 1 из 1
23.05.2019, 15:04
    #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
23.05.2019, 15:09
    #39817180
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку по условию - все значения, а не хотя бы одно
Qwe.Qwe1,

Считайте про реляционное деление. Простейшая реализация - на [not]exists-подзапросах, либо на группировке с последующей фильтрацией (group by + having)
...
Рейтинг: 0 / 0
23.05.2019, 16:17
    #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
23.05.2019, 16:27
    #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
23.05.2019, 16:35
    #39817258
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку по условию - все значения, а не хотя бы одно
Qwe.Qwe1,

вы в курсе, что будет, если подзапрос в первом варианте не вернёт ни одной записи?
...
Рейтинг: 0 / 0
23.05.2019, 16:40
    #39817261
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку по условию - все значения, а не хотя бы одно
Почему бы сначала не определить число уникальных DocTypeID,
а потом не сгруппировать по уникальным MainID + DocTypeID
с последующим фильтром по числу уникальных DocTypeID,
...
Рейтинг: 0 / 0
23.05.2019, 16:42
    #39817264
Qwe.Qwe1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку по условию - все значения, а не хотя бы одно
2 iap, а как это вариант переделать? Да, сейчас он не корректно работает...
...
Рейтинг: 0 / 0
23.05.2019, 17:28
    #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
23.05.2019, 17:35
    #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
24.05.2019, 11:18
    #39817614
Qwe.Qwe1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на выборку по условию - все значения, а не хотя бы одно
Всем спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на выборку по условию - все значения, а не хотя бы одно / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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