Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

Composed query with groupBy clause in subquery fails

Offen
#746 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
45/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Veraltet
Tech-Stack
fsharp, sql
Bereich
databases

Rechercherichtung

Beginne damit, die Übersetzung zusammengesetzter F#-Abfragen durch SQLProvider mit einer groupBy-Klausel nachzuverfolgen, und untersuche die für die Reproduktion generierte Unterabfrage. Als erledigt gilt die Aufgabe, wenn die IN-Unterabfrage nur die angeforderte Aggregatspalte auswählt, während die explizite Auswahl des Gruppenschlüssels diesen weiterhin einschließt; füge einen Regressionstest hinzu oder führe einen aus, der beide Fälle abdeckt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Describe the bug
SqlException "Only one expression can be specified in the select list when the subquery is not introduced with EXISTS." returned when using a composed query when the subquery has a groupBy clause. This is because SQLProvider includes the groupBy key in the select clause even if you haven't asked for it.

To Reproduce
Steps to reproduce the behavior:

  1. Take a query that uses a subquery with a groupBy clause, e.g.:
let test =
    let lastAddresses =
        query {
            for a in dbContext.Address do
            where (a.Deleted.IsNone)
            groupBy a.UserId into g
            select (g.Max(fun a -> a.Id))
        }
    let result =
        query {
            for a in dbContext.Address do
            where (lastAddresses.Contains(a.Id))
            select a
        }
    result
  1. Run the query, and you get the SqlException described above.
  2. Inspecting the SQL produced, you can see the problem:
SELECT *
FROM [address] as [a] 
WHERE (([a].[Id] IN (
	SELECT [a].[UserId] as '[a].[UserId]', MAX([a].[Id]) as '[a].[MAX_Id]'
	FROM [address] as [a]
	WHERE (([a].[Deleted] IS NOT NULL))
	GROUP BY [a].[UserId]))
)
  1. Basically SQLProvider is including [a].[UserId] as '[a].[UserId]' in the select clause of the subquery. The IN clause is only expecting a single column in the subquery so fails.

Expected behavior

SQLProvider should only return the columns requested in the query. The SQL produced should be:

SELECT *
FROM [address] as [a] 
WHERE (([a].[Id] IN (
	SELECT MAX([a].[Id]) as '[a].[MAX_Id]'
	FROM [address] as [a]
	WHERE (([a].[Deleted] IS NOT NULL))
	GROUP BY [a].[UserId]))
)

Additional context
If we wanted the groupBy key included in the select statement, we could do so by requesting it explicitly, so there is no reason why SQLProvider should do this for us unsolicitedly:

let test =
    let lastAddresses =
        query {
            for a in dbContext.Address do
            where (a.Deleted.IsNone)
            groupBy a.UserId into g
            select (g.Key, g.Max(fun a -> a.Id))
        }
    let result =
        query {
            for a in dbContext.Address do
            where (lastAddresses.Contains(a.Id))
            select a
        }
    result
Vorherrschende Sprache
F#
Sterne
627
Forks
148
Ø Merge
2 Std. 2 Min.
Gemergte PRs (30 T.)
1

Entwicklungsumgebung

In Codespaces öffnen

Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.

  • Kein Dockerfile und keine Docker-Compose-Datei
  • Hat eine Pull-Request-Vorlage
  • Kein Beitragsleitfaden

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus fsprojects/SQLProvider

Alle Issues in fsprojects/SQLProvider

Ähnliche Issues

Weitere Issues zu Databases

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.