sql - select * from (select a,b,c ...) guaranteed order of result columns? -
i had comment in code review:
it's better enumerate fields explicitly. "select *" doesn't guarantee order
is true in case query select * (select a,b,c ...)? can't imagine database engine re-order columns in result, imagination more logical database engines.
the advice against select * when you're querying tables directly.
in databases it's possible insert new column partway through table, such table t (a, b) becomes table t (a, c, b). postgresql not (yet) support this, can still append columns, , can drop columns anywhere, can still t (a, c) if add c , drop b.
this why it's considered bad practice use * in production queries, if application relies on ordinal column position read results. really, applies situations not specify fields elsewhere in query.
in case in subquery. * safe , imo quite acceptable in usage.
this:
select * (select a,b,c ... t) is fine.
this:
select * t or
select * (select * t) are problematic, because leave column-order undefined application. that's problem if application assumes column order without checking query metadata.
personally prefer qualify columns of time, there sure times when * readable option.
it's also, imo, quite fine use select * when client application reads columns name, not ordinal. if app never cares if c 2nd column or 3rd because uses result metadata build row dictionary (like perl's dbi or python's psycopg2 can do) there's no real reason not use *.
there can performance costs select * when need subset of columns, though. missed opportunities use index-only scans, unnecessary fetching of out-of-line toasted data, , bandwidth wasted unwanted values, among other things. of time it's still not great idea.
Comments
Post a Comment