SQL, только если совпадают все значения внешнего ключа для возврата записи?

У меня две таблицы

Table A
type_uid, allowed_type_uid
9,1
9,2
9,4
1,1
1,2
24,1
25,3

Table B
type_uid
1
2

Из таблицы A I нужно возвращаться

9
1

Используя WHERE IN пункт я могу вернуть

9
1
24

3 ответа

Решение
SELECT
  TableA.type_uid
FROM
  TableA
INNER JOIN
  TableB
    ON TableA.allowed_type_uid = TableB.type_uid
GROUP BY
  TableA.type_uid
HAVING
  COUNT(distinct TableB.type_uid) = (SELECT COUNT(distinct type_uid) FROM TableB)

Соедините две таблицы вместе, чтобы у вас были только записи, соответствующие интересующим вас типам.

Группировать результат по TableA.type_uid,

Убедитесь, что каждая группа имеет одинаковое количество allowed_type_uid значения, существующие в TableB.type_uid,

distinct требуется только в том случае, если в любой таблице могут быть повторяющиеся записи. Если известно, что обе таблицы имеют только уникальные значения, distinct могут быть удалены.


Следует также отметить, что по мере увеличения размера TableA этот тип запросов будет быстро снижаться в производительности. Это потому, что индексы здесь не особо помогают.

Это может быть полезной структурой, но я бы не рекомендовал запускать запросы в режиме реального времени. Скорее используйте его для создания другого сохраненного / кэшированного набора результатов и используйте его только для обновления этих результатов по мере необходимости.

Или немного более дешевая версия (ресурсная):

SELECT 
    Data.type_uid
FROM 
    A AS Data
    CROSS JOIN
    B
    LEFT JOIN
    A
    ON Data.type_uid = A.type_uid AND B.type_uid = A.allowed_type_uid
GROUP BY 
    Data.type_uid
HAVING 
    MIN(ISNULL(A.allowed_type_uid,-999)) != -999

Ваше объяснение не очень понятно. Я думаю, что вы хотите получить те type_uid из таблицы A, где для всех записей в таблице B есть соответствующий A.Allowed_type_uid.

SELECT T2.type_uid
FROM (SELECT COUNT(*) as AllAllowedTypes FROM #B) as T1,
    (SELECT #A.type_uid, COUNT(*) as AllowedTypes
    FROM #A
        INNER JOIN #B ON
            #A.allowed_type_uid = #B.type_uid
    GROUP BY #A.type_uid
    ) as T2
WHERE T1.AllAllowedTypes = T2.AllowedTypes

(Демс, ты был быстрее меня:))

Другие вопросы по тегам