OmniSelect FileSQL

Guides
← Back to App
Home › Guides › Querying 26 files at once

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.

FileAliasWhy
sales.csvSFirst letter, and S is free
regions.parquetRFirst letter, and R is free
services.yamlAS is taken by sales.csv, so it falls back to the first free letter
💡 That fallback is the single most common surprise. Do not assume the letter — read the Alias column, or type your own letter into it. If two files start with the same letter and you care which is which, rename one before loading, or set the alias by hand.

Loading Them All

  1. Click anywhere on the File Select panel to open the file picker.
  2. Select every file — Ctrl+A in the dialog, or click the first and shift-click the last.
  3. 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.

💡 This is the single most common reason a big load "only seems to use four or five files": the query written against it only names four or five aliases. Add more tables to the query — another join, another 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.

💡 Typing twenty-six near-identical lines by hand invites a mistyped letter. Write the first two lines, then let your editor's multi-cursor or find-and-replace step the letter and the number through the rest, and check the count of 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

LimitValue
Files loaded at once26 — one per letter of the alphabet
Size per file50 MB
Rows per file1,000,000
Tables in one joinNo 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.

Related Guides