# Selecting dynamic values w/o \`FROM\` for later insertion

**URL:** <https://discourse.diesel.rs/t/selecting-dynamic-values-w-o-from-for-later-insertion/58>\
**Category:** Uncategorized\
**Created:** [November 16, 2018, 10:39am UTC](https://discourse.diesel.rs/t/selecting-dynamic-values-w-o-from-for-later-insertion/58 "2018-11-16T10:39:06Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![alexfedoseev](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.diesel.rs/alexfedoseev/32/33_2.png) [@alexfedoseev](https://discourse.diesel.rs/u/alexfedoseev)\
**Post date:** [November 16, 2018, 10:39am UTC](https://discourse.diesel.rs/t/selecting-dynamic-values-w-o-from-for-later-insertion/58/1 "2018-11-16T10:39:06Z")

</div>

I’m attempting to express this SQL using DSL:

```sql
SELECT $1, $2
WHERE EXISTS(
  SELECT * FROM projects
  WHERE id = $2 AND user_id = $3
)

```

My naive implementation gives me error:

```auto
diesel::select((&title, &project_id)).filter(diesel::select(exists(
  projects::table
    .filter(projects::id.eq(&project_id))
    .filter(projects::user_id.eq(&user_id)),
)));

```

```auto
# table names are a bit different from simplified example
the trait bound `diesel::query_builder::SelectStatement<(), diesel::query_builder::select_clause::SelectClause<diesel::expression::exists::Exists<diesel::query_builder::SelectStatement<db::schema::personal_projects::table, diesel::query_builder::select_clause::DefaultSelectClause, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::And<diesel::expression::operators::Eq<db::schema::personal_projects::columns::id, diesel::expression::bound::Bound<diesel::sql_types::Integer, &types::id::Id>>, diesel::expression::operators::Eq<db::schema::personal_projects::columns::user_id, diesel::expression::bound::Bound<diesel::sql_types::Integer, &types::id::Id>>>>>>>>: diesel::Expression` is not satisfied

the trait `diesel::Expression` is not implemented for `diesel::query_builder::SelectStatement<(), diesel::query_builder::select_clause::SelectClause<diesel::expression::exists::Exists<diesel::query_builder::SelectStatement<db::schema::personal_projects::table, diesel::query_builder::select_clause::DefaultSelectClause, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::And<diesel::expression::operators::Eq<db::schema::personal_projects::columns::id, diesel::expression::bound::Bound<diesel::sql_types::Integer, &types::id::Id>>, diesel::expression::operators::Eq<db::schema::personal_projects::columns::user_id, diesel::expression::bound::Bound<diesel::sql_types::Integer, &types::id::Id>>>>>>>>`

note: required because of the requirements on the impl of `diesel::query_dsl::filter_dsl::FilterDsl<diesel::query_builder::SelectStatement<(), diesel::query_builder::select_clause::SelectClause<diesel::expression::exists::Exists<diesel::query_builder::SelectStatement<db::schema::personal_projects::table, diesel::query_builder::select_clause::DefaultSelectClause, diesel::query_builder::distinct_clause::NoDistinctClause, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::And<diesel::expression::operators::Eq<db::schema::personal_projects::columns::id, diesel::expression::bound::Bound<diesel::sql_types::Integer, &types::id::Id>>, diesel::expression::operators::Eq<db::schema::personal_projects::columns::user_id, diesel::expression::bound::Bound<diesel::sql_types::Integer, &types::id::Id>>>>>>>>>` for `diesel::query_builder::SelectStatement<(), diesel::query_builder::select_clause::SelectClause<(&_, &_)>>`

```

Full context why I need this:

```sql
INSERT INTO data (title, project_id)
SELECT $1, $2
WHERE EXISTS(
  SELECT * FROM projects
  WHERE id = $2 AND user_id = $3
)
RETURNING *

```

By this query, I want to make sure provided `project_id` reference belongs to current user.

And here is DSL that “I wish it would work but it doesn’t”:

```auto
diesel::insert_into(data::table)
  .values(
    diesel::select((&title, &project_id)).filter(diesel::select(exists(
      projects::table
        .filter(projects::id.eq(&project_id))
        .filter(projects::user_id.eq(&user_id)),
    )))
  )
  .into_columns((data::title, data::project_id))
  .get_result::<Data>(&*self.pool.get());

```

---

<div class="post-metadata">

**Author:** ![weiznich](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.diesel.rs/weiznich/32/64_2.png) [@weiznich](https://discourse.diesel.rs/u/weiznich)\
**Post date:** [November 17, 2018, 11:03pm UTC](https://discourse.diesel.rs/t/selecting-dynamic-values-w-o-from-for-later-insertion/58/2 "2018-11-17T23:03:55Z")

</div>

Writing queries without from clause is currently not possible using the DSL.  
If you really need to do this you will need to use `sql_query` and write the raw sql query string there.

---

<div class="post-metadata">

**Author:** ![alexfedoseev](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.diesel.rs/alexfedoseev/32/33_2.png) [@alexfedoseev](https://discourse.diesel.rs/u/alexfedoseev)\
**Post date:** [November 18, 2018, 4:22am UTC](https://discourse.diesel.rs/t/selecting-dynamic-values-w-o-from-for-later-insertion/58/3 "2018-11-18T04:22:55Z")

</div>

Yeah, already fellback to `sql_query`, thanks!
