diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 919e951fa2..e1a240dec3 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -358,11 +358,13 @@ class SQLCompiler:
                     if (
                         field.nulls_first is None and field.nulls_last is None
                     ) or self.connection.features.supports_order_by_nulls_modifier:
+                        field = field.copy()
                         field.expression = select_ref
                     # Alias collisions are not possible when dealing with
                     # combined queries so fallback to it if emulation of NULLS
                     # handling is required.
                     elif self.query.combinator:
+                        field = field.copy()
                         field.expression = Ref(select_ref.refs, select_ref.source)
                 yield field, select_ref is not None
                 continue
diff --git a/tests/ordering/tests.py b/tests/ordering/tests.py
index 7ff38acc4a..b29404ed77 100644
--- a/tests/ordering/tests.py
+++ b/tests/ordering/tests.py
@@ -638,3 +638,9 @@ class OrderingTests(TestCase):
             .first(),
             self.a1,
         )
+
+    def test_order_by_expr_query_reuse(self):
+        qs = Author.objects.annotate(num=Count("article")).order_by(
+            F("num").desc(), "pk"
+        )
+        self.assertCountEqual(qs, qs.iterator())