This is a valid expression:
SELECT (SELECT count(*) FROM table) + 1
This is not: SELECT (SELECT * FROM table), 1
In EdgeQL: SELECT (count(SomeType) + 1)
and SELECT (SomeType, 1)
are equally valid.This is a valid expression:
SELECT (SELECT count(*) FROM table) + 1
This is not: SELECT (SELECT * FROM table), 1
In EdgeQL: SELECT (count(SomeType) + 1)
and SELECT (SomeType, 1)
are equally valid. SELECT count(*) + 1 FROM table
And SELECT *, 1 FROM table
Both of which are valid in SQL. And you'd get the same result as in the EdgeQL examples.Indeed, a more relevant second counter example would be:
SELECT (SELECT * FROM table) + 1
Not valid... unless `table` only had one row and one column containing a number.Some people use a thing x
A subset of those people use a subset of x called y
This subset of people have built a tool to make y easier to express
Thus x is invalid
I think that's a really bad argument, if everyone was using ORMs then we'd all merrily forget about SQL and just use ORMs which would become the new "language for structuring queries", but we don't all, and EdgeDB in particular thinks that ORMs provide a much degraded expression set from SQL and thus want to tweak X so that it's as expressible as the tool to express Y but without making it just about Y... I think your goal boils down to shifting the trade-off point between X and Y - the extreme of which is writing a very expressive Y that also supports X but in a non-expressive manner.
SELECT Table1, 1
returns each row of Table1 along with 1 and that 1 returns the set {1} means that you have arbitrarily assigned each row of Table1 a row from the set {1}. This gives what you want in the case of a scalar, but what about a non-scalar.
For example, suppose Table1 contains (John, Smith), (Alice, Perkins), (Bob, Best). Then, what should
SELECT Table1, {1,2}
return? If you do not say cross product, you have arbitrarily assigned rows to one another, resulting in meaningless data. If you say cross product, then you have rewritten the sql expression
SELECT * FROM Table1, (VALUES (1), (2))
I don't disagree the SQL syntax is longer and has some unnecessary keywords, but unlike EdgeQL, the query means something particular.
edgedb> SELECT {'First', 'Second'} ++ '!';
{'First!', 'Second!'}
EdgeQL queries are essentially set comprehensions.SELECT 1
and SELECT * FROM TABLE1 and SELECT 1 compose to
> SELECT * FROM TABLE1, (SELECT 1)
Aside from the different syntax, it is the same kind of composition. Not sure what EdgeQL has gained here, then.
This cannot be the case if you call each thing a 'set'. Unless `(a, b)` calculates the cross product, there is no meaningful non-arbitrary way to assign each element of a to an element of b. That would depend on an ordering, which makes it not a set to everyone but a marketing dept somewhere.
SELECT count(star) FROM table
and
SELECT star FROM table
Are both valid, not equivalent.
Furthermore, listing any kind of set depends on some ordering, be it random.
What would you expect to returned for by this query?