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
(Демс, ты был быстрее меня:))