Инструкция SQL, которая показывает, есть ли значение в другой таблице - PullRequest
0 голосов
/ 16 октября 2018

У меня есть два файла, заголовок и подробности.В подробном файле есть ключевое поле для поиска или присоединения заголовка.Мне нужно посчитать количество строк заголовка, которые имеют подробную запись.Я хочу узнать количество записей только с field1 = 'A' и количество строк заголовка, в которых есть запись с field1 = 'A' или = 'B'.

. Это не работает с объединением или CASE и subselect query.

Вот упрощенный пример:

  • Таблица AA (заголовок) и таблица BB (подробности).Таблица AA имеет поле HeadId.
  • Таблица BB имеет три поля: HeadId, DetId и Data.HeadId используется для соединения с таблицей заголовков.Значение поля Data может быть равно A или B. Строка AA может иметь больше строк на BB.

Мне нужно знать, сколько строк в AA имеют BB только строк со значением Data = A иу скольких есть и A, и B. Мне нужно сделать это только с помощью SQL-запроса.

Пожалуйста, вы можете мне помочь?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Есть несколько способов сделать одно и то же.Основываясь на моем коде немного от ответа Йоакима, этот работает для меня:

SELECT headId 
  FROM HEADER;

HEADID
------
     1
     2
     3
     4

select headId,
       detailId,
       someData
  from Detail
;

HEADID     DETAILID  SOMEDATA
------  -----------  --------
     1            1  A       
     2            1  A       
     2            2  B       
     3            1  X       
     4            1  A       

SELECT 'Only A' AS TYPE,
        COUNT(*) AS COUNT
  FROM HEADER H
 WHERE EXISTS (SELECT 1 FROM DETAIL D
               WHERE D.HEADID = H.HEADID AND SOMEDATA = 'A')
   AND NOT EXISTS (SELECT 1 FROM DETAIL D
                   WHERE D.HEADID = H.HEADID AND SOMEDATA <> 'A')
 GROUP BY 'Only A'
UNION
SELECT 'Both A and B' AS TYPE,
        COUNT(*) AS COUNT
  FROM HEADER H
 WHERE EXISTS (SELECT 1 FROM DETAIL D
               WHERE D.HEADID = H.HEADID AND SOMEDATA = 'A')
   AND EXISTS (SELECT 1 FROM DETAIL D
                WHERE D.HEADID = H.HEADID AND SOMEDATA = 'B') 
 GROUP BY 'Both A and B'
;

TYPE                COUNT
------------  -----------
Both A and B            1
Only A                  2

Надеюсь, это поможет!

0 голосов
/ 16 октября 2018

Для этого я использовал объединение и только таблицу «BB» для подсчета

SELECT COUNT(*) as count, 'Only A' as type
FROM BB b
WHERE NOT EXISTS (SELECT headId FROM BB WHERE Data != 'A' AND headId = b.headId)
GROUP BY headId, data
UNION
SELECT COUNT(*), 'A and B'
FROM BB b1
JOIN BB b2 ON b1.headId = b2.headId AND b1.id != b2.id AND b1.data != b2.data
WHERE b1.data IN ('A', 'B') AND b2.data IN ('A', 'B')
GROUP BY b1.headId
...