При вызове .map(f)
для Map
с f
, который возвращает (K, V)
для некоторых K и V (не обязательно тех же типов K и V оригинала Map
), результатом будет Map[K, V]
. В противном случае, если f
возвращает какой-либо другой (не парный) тип T
, результатом будет Iterable[T]
. Так что будет Map
, если функция вернет пару, и Iterable
в противном случае.
В вашем случае функция возвращает List[(Int, Int)]
, поэтому результатом является Iterable[List[(Int, Int)]]
, а не Map. .flatten
затем превращает это в Iterable[(Int, Int)]
.
При непосредственном использовании flatMap
вы напрямую получите пары (Int, Int)
, поэтому результатом будет Map[Int, Int]
, а не Iterable[(Int, Int)]
. И поскольку Map
не допускают дублирования ключей, Map
содержит меньше элементов, чем Iterable
.
Не без ведома схемы (например, 'действительно ли x' является таблицей?) и запись синтаксического анализатора SQL. Ваше инструментальное средство формирования запросов MySQL должно смочь сделать такую проверку (intellisense, если Вам нравится), но я знаю из собственного опыта, большинство (свободных) инструментов MySQL плачевно.
'Подготовка' запроса сделала бы то, что Вы хотите, но проверка на этапе выполнения, не проверка времени компиляции - Вы, кажется, ищете время компиляции / офлайновое решение.
Вы могли составить временную таблицу для хитрости побочных эффектов запроса:
CREATE TEMPORARY TABLE users SELECT * FROM users;
INSERT INTO users(name) VALUES('UniqueName');
DROP TABLE users;
SELECT * FROM users WHERE name='UniqueName'; -- Should return 0 results
В зависимости от Вашего механизма MySQL и настроек, Вы могли запустить транзакцию, попробовать запрос и затем сделать откат. Принимающие грязные чтения выключены, который должен работать.