diff --git a/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php b/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
index 05f338b..2a32af7 100644
--- a/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
+++ b/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
@@ -200,6 +200,17 @@ class EntityFieldQuery {
   public $executeCallback = '';
 
   /**
+   * Identifiers for fields that should be included when the value is NULL. For
+   * the default SQL Storage Engine, this is the Table Name, and results in the
+   * use of a LEFT JOIN rather than the default INNER JOIN
+   *
+   * @var array
+   *
+   * @see field_sql_storage_field_storage_query()
+   */
+  public $includeNull = array();
+
+  /**
    * Adds a condition on entity-generic metadata.
    *
    * If the overall query contains only entity conditions or ordering, or if
diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 455ecc2..349f661 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -1909,6 +1909,10 @@ function hook_field_storage_delete_revision($entity_type, $entity, $fields) {
  * engine also handles property sorts and orders, it should unset those
  * properties in the called object to signal that those have been handled.
  *
+ * Entities should be included which have NULL values for any fields identified
+ * in $query->includeNull. For SQL-based RDBMS, this likely requires a
+ * LEFT JOIN.
+ *
  * @param Drupal\entity\EntityFieldQuery $query
  *   An EntityFieldQuery.
  *
@@ -1933,7 +1937,8 @@ function hook_field_storage_query($query) {
     $table_alias = $tablename . $key;
     $table_aliases[$key] = $table_alias;
     if ($key) {
-      $select_query->join($tablename, $table_alias, "$table_alias.entity_type = $field_base_table.entity_type AND $table_alias.$id_key = $field_base_table.$id_key");
+      $join_type = in_array($tablename, (array) $query->includeNull) ? 'leftJoin' : 'join';
+      $select_query->$join_type($tablename, $table_alias, "$table_alias.entity_type = $field_base_table.entity_type AND $table_alias.$id_key = $field_base_table.$id_key");
     }
     else {
       $select_query = db_select($tablename, $table_alias);
diff --git a/core/modules/field/modules/field_sql_storage/field_sql_storage.module b/core/modules/field/modules/field_sql_storage/field_sql_storage.module
index fd2f52c..36e02e6 100644
--- a/core/modules/field/modules/field_sql_storage/field_sql_storage.module
+++ b/core/modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -514,7 +514,8 @@ function field_sql_storage_field_storage_query(EntityFieldQuery $query) {
     $table_alias = $tablename . $key;
     $table_aliases[$key] = $table_alias;
     if ($key) {
-      $select_query->join($tablename, $table_alias, "$table_alias.entity_type = $field_base_table.entity_type AND $table_alias.$id_key = $field_base_table.$id_key");
+      $join_type = in_array($tablename, (array) $query->includeNull) ? 'leftJoin' : 'join';
+      $select_query->$join_type($tablename, $table_alias, "$table_alias.entity_type = $field_base_table.entity_type AND $table_alias.$id_key = $field_base_table.$id_key");
     }
     else {
       $select_query = db_select($tablename, $table_alias);
