Query 26 Files in One Statement
A spreadsheet starts to struggle at two files. This takes twenty-six, loaded together, as tables A through Z — reference lists, monthly extracts and everything in between, joined and stacked in ordinary SQL.
Where the Letter Comes From
Each file becomes a table named by a single letter, shown in the Alias column. The letter is taken from the first letter of the filename, and if that letter is already in use, the next free letter A–Z is assigned instead.
| File | Alias | Why |
|---|---|---|
sales.csv | S | First letter, and S is free |
regions.parquet | R | First letter, and R is free |
services.yaml | A | S is taken by sales.csv, so it falls back to the first free letter |
Loading Them All
- Click anywhere on the File Select panel to open the file picker.
- Select every file —
Ctrl+Ain the dialog, or click the first and shift-click the last. - They load together. The panel scrolls; each row shows the filename, type and alias.
A useful convention when you have many: prefix the filenames so the alphabet does the ordering for you. a-customers.csv, b-products.csv, c-regions.csv and so on gives you an alias map you can predict without reading it.
Select a folder's worth of files and query the lot.
Open the app →Why "Loaded" Doesn't Mean "Queried"
Load all twenty-six and write a query that only names four of their aliases in its FROM and JOIN clauses, and only those four are actually read. The other twenty-two sit in the File Select panel, their alias assigned, otherwise untouched. That is not a cap on how many files can work together — it is why dropping in a fiftieth file you are not querying costs nothing. A query only ever reads the tables it names.
UNION ALL branch — and more of the loaded files take part. A misspelled alias has the same symptom and gives no error: that table is silently missing from the result rather than the query failing outright.Joining Six of Them at Once
With a-customers.csv, b-products.csv, c-regions.csv, d-stores.csv and f-employees.csv (e is already taken by the monthly orders extract, loaded as E), revenue by region, store and salesperson:
SELECT C.region, D.store_name, F.employee_name, B.category, COUNT(*) AS orders, ROUND(SUM(E.amount)) AS revenue FROM E JOIN A ON E.customer_id = A.customer_id JOIN B ON E.product_id = B.product_id JOIN C ON A.region = C.region JOIN D ON E.store_id = D.store_id JOIN F ON E.employee_id = F.employee_id GROUP BY C.region, D.store_name, F.employee_name, B.category ORDER BY revenue DESC
Six files, one statement, no import step and no database. Formats can be mixed freely — a Parquet extract joins to a CSV lookup list exactly as if they were two tables in the same schema. Nothing about this stops at six; a query naming all twenty-six is the same pattern with more JOIN lines, and each one multiplies the work, which is the real reason to stop before then, not any limit in the tool.
Stacking All Twenty-Six
The other common shape, and the one that actually uses every letter: twenty-six files with the same columns — a year of fortnightly extracts, near enough, or one file per region for a chain with twenty-six branches — that you want as one table. UNION ALL does it, and here it is done for real, not shortened with an ellipsis:
SELECT 'Week 1' AS week, COUNT(*) AS orders, ROUND(SUM(amount)) AS revenue FROM A UNION ALL SELECT 'Week 2', COUNT(*), ROUND(SUM(amount)) FROM B UNION ALL SELECT 'Week 3', COUNT(*), ROUND(SUM(amount)) FROM C UNION ALL SELECT 'Week 4', COUNT(*), ROUND(SUM(amount)) FROM D UNION ALL SELECT 'Week 5', COUNT(*), ROUND(SUM(amount)) FROM E UNION ALL SELECT 'Week 6', COUNT(*), ROUND(SUM(amount)) FROM F UNION ALL SELECT 'Week 7', COUNT(*), ROUND(SUM(amount)) FROM G UNION ALL SELECT 'Week 8', COUNT(*), ROUND(SUM(amount)) FROM H UNION ALL SELECT 'Week 9', COUNT(*), ROUND(SUM(amount)) FROM I UNION ALL SELECT 'Week 10', COUNT(*), ROUND(SUM(amount)) FROM J UNION ALL SELECT 'Week 11', COUNT(*), ROUND(SUM(amount)) FROM K UNION ALL SELECT 'Week 12', COUNT(*), ROUND(SUM(amount)) FROM L UNION ALL SELECT 'Week 13', COUNT(*), ROUND(SUM(amount)) FROM M UNION ALL SELECT 'Week 14', COUNT(*), ROUND(SUM(amount)) FROM N UNION ALL SELECT 'Week 15', COUNT(*), ROUND(SUM(amount)) FROM O UNION ALL SELECT 'Week 16', COUNT(*), ROUND(SUM(amount)) FROM P UNION ALL SELECT 'Week 17', COUNT(*), ROUND(SUM(amount)) FROM Q UNION ALL SELECT 'Week 18', COUNT(*), ROUND(SUM(amount)) FROM R UNION ALL SELECT 'Week 19', COUNT(*), ROUND(SUM(amount)) FROM S UNION ALL SELECT 'Week 20', COUNT(*), ROUND(SUM(amount)) FROM T UNION ALL SELECT 'Week 21', COUNT(*), ROUND(SUM(amount)) FROM U UNION ALL SELECT 'Week 22', COUNT(*), ROUND(SUM(amount)) FROM V UNION ALL SELECT 'Week 23', COUNT(*), ROUND(SUM(amount)) FROM W UNION ALL SELECT 'Week 24', COUNT(*), ROUND(SUM(amount)) FROM X UNION ALL SELECT 'Week 25', COUNT(*), ROUND(SUM(amount)) FROM Y UNION ALL SELECT 'Week 26', COUNT(*), ROUND(SUM(amount)) FROM Z
Every one of the twenty-six aliases is named, so every one of the twenty-six files is actually read this time — not the four or six from the join above. The literal week number in the first column is worth the typing — without it, the combined rows come back with no way to tell which file each one came from.
UNION ALL keywords matches the count of files afterwards — twenty-five, joining twenty-six SELECTs.TOTAL is a reserved word in the SQL engine, so AS total is a parse error. Use AS revenue, AS total_amount or anything else. It is an easy five minutes to lose if you do not know.The Limits, Honestly
| Limit | Value |
|---|---|
| Files loaded at once | 26 — one per letter of the alphabet |
| Size per file | 50 MB |
| Rows per file | 1,000,000 |
| Tables in one join | No fixed limit below 26, but each join multiplies the work |
The real constraint is your machine. Twenty-six files of a few thousand rows each is comfortable on a laptop. Twenty-six files at the 50 MB ceiling is not what this is for, and a warehouse or DuckDB is the right answer at that point — that is a genuine recommendation, not a grudging one.
Reasonable Questions
I loaded 26 files, but the results only reflect four or five of them — why?
Because your query only named four or five aliases. Loading a file assigns it a letter and makes it available; it does not add it to a query unless that query's FROM, JOIN or UNION ALL actually says so. Check every alias your query is supposed to touch is really there — see why "loaded" doesn't mean "queried" above, and the fully-written twenty-six-line example that does touch every file.
Can I use the plain-English box across several files?
Yes. It infers relationships between the loaded files and writes the join for you, so a question spanning two files produces a join without you naming it. With twenty-six loaded it is better used for single-table questions; write the big joins yourself. See the guide.
What if I need a twenty-seventh file?
Remove one first. The alphabet is the hard limit, and it was chosen because a single-letter alias keeps queries readable.
Do the files have to be the same format?
No. Mix CSV, Excel, JSON, XML, YAML, Avro and Parquet in one query — see the formats guide.
Can I change an alias after loading?
Yes — type a different letter into the Alias box on that row. Queries you have already written will need updating to match.
Does loading 26 files send 26 uploads?
It sends nothing at all. Every file is read locally; the network panel stays empty throughout. Check it here.