diff --git a/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php b/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php
index a873de2b081b6439af759e82544cee217272d23a..8d376db666eab795e357276453fd23cfe4e1f680 100644
--- a/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php
+++ b/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php
@@ -363,9 +363,31 @@ protected function ensureEntityTable($index_prefix, $property, $type, $langcode,
         // and the base table alias. This way, if the same entity table is
         // joined several times for different entity reference fields, each join
         // gets a unique alias.
-        $key = $index_prefix . ($base_table === 'base_table' ? $table : $base_table);
+        $key = $index_prefix . ($base_table === 'base_table' ? $table : $base_table) . $type;
         if (!isset($this->entityTables[$key])) {
-          $this->entityTables[$key] = $this->addJoin($type, $table, "[%alias].[$id_field] = [$base_table].[$id_field]", $langcode);
+          $tables = $this->sqlQuery->getTables();
+          if (isset($tables[$key])) {
+            $this->entityTables[$key] = $key;
+          }
+          elseif (
+            $type === 'INNER' &&
+            $base_table === 'base_table' &&
+            $tables['base_table']['table'] === $table
+          ) {
+            // When the above conditions are true this is a needless self join to
+            // the entity base table so don't add a join, and set the table alias
+            // correctly.
+            $this->entityTables[$key] = 'base_table';
+          }
+          elseif (
+            isset($tables[$table]) &&
+            $tables[$table]['join type'] === $type
+          ) {
+            $this->entityTables[$key] = $table;
+          }
+          else {
+            $this->entityTables[$key] = $this->addJoin($type, $table, "[%alias].[$id_field] = [$base_table].[$id_field]", $langcode);
+          }
         }
         return $this->entityTables[$key];
       }