Обсуждение: BUG #14188: "FOR SELECT DISTINCT, ORDER BY expressions must appear IN SELECT list" error and table alias

Поиск
Список
Период
Сортировка

BUG #14188: "FOR SELECT DISTINCT, ORDER BY expressions must appear IN SELECT list" error and table alias

От
gabrimonfa@gmail.com
Дата:
VGhlIGZvbGxvd2luZyBidWcgaGFzIGJlZW4gbG9nZ2VkIG9uIHRoZSB3ZWJz
aXRlOgoKQnVnIHJlZmVyZW5jZTogICAgICAxNDE4OApMb2dnZWQgYnk6ICAg
ICAgICAgIEdhYnJpZWxlIE1vbmZhcmRpbmkKRW1haWwgYWRkcmVzczogICAg
ICBnYWJyaW1vbmZhQGdtYWlsLmNvbQpQb3N0Z3JlU1FMIHZlcnNpb246IDku
NS4zCk9wZXJhdGluZyBzeXN0ZW06ICAgRGViaWFuCkRlc2NyaXB0aW9uOiAg
ICAgICAgCgpDUkVBVEUgVEFCTEUgdGFibGUxIChpZCBpbnRlZ2VyIHByaW1h
cnkga2V5LCBuYW1lIHZhcmNoYXIpOw0KQ1JFQVRFIFRBQkxFIHRhYmxlMiAo
aWQgaW50ZWdlciBwcmltYXJ5IGtleSwgaG9tZSB2YXJjaGFyKTsNCg0KU0VM
RUNUIERJU1RJTkNUIG5hbWUgRlJPTSB0YWJsZTEgdDEgSU5ORVIgSk9JTiB0
YWJsZTIgdDIgT04gKHQxLmlkID0gdDIuaWQpCk9SREVSIEJZIHQxLm5hbWU7
DQpFUlJPUjogIGZvciBTRUxFQ1QgRElTVElOQ1QsIE9SREVSIEJZIGV4cHJl
c3Npb25zIG11c3QgYXBwZWFyIGluIHNlbGVjdApsaXN0DQpSSUdBIDE6IC4u
LnQxIElOTkVSIEpPSU4gdGFibGUyIHQyIE9OICh0MS5pZCA9IHQyLmlkKSBP
UkRFUiBCWSB0MS5uYW1lOw0KDQpTRUxFQ1QgRElTVElOQ1QgbmFtZSBGUk9N
IHRhYmxlMSB0MSBJTk5FUiBKT0lOIHRhYmxlMiB0MiBPTiAodDEuaWQgPSB0
Mi5pZCkKT1JERVIgQlkgbmFtZTsNCiBuYW1lIA0KLS0tLS0tDQooMCByaWdo
ZSkNCg0KU3VyZSBuYW1lIG1heSBiZSBxdWFsaWZpZWQgaW4gU0VMRUNUIGxp
c3QgYnV0IGl0IGlzIG5vdCBhbWJpZ3VvdXMuDQoNCk90aGVyIGV4YW1wbGU6
DQpDUkVBVEUgVEFCTEUgdGFibGUxIChpZCBJTlRFR0VSLCBOQU1FIFZBUkNI
QVIpOw0KQ1JFQVRFIFRBQkxFIHRhYmxlMiAoaWQgSU5URUdFUiwgaG9tZSBW
QVJDSEFSKTsNCiANClNFTEVDVCBESVNUSU5DVCAqIEZST00gdGFibGUxIHQx
IElOTkVSIEpPSU4gdGFibGUyIHQyIE9OICh0MS5pZCA9IHQyLmlkKQpPUkRF
UiBCWSBOQU1FOw0KIGlkIHwgTkFNRSB8IGlkIHwgaG9tZQ0KLS0tLSstLS0t
LS0rLS0tLSstLS0tLS0NCigwIHJpZ2hlKQ0KIA0KU0VMRUNUIERJU1RJTkNU
ICogRlJPTSB0YWJsZTEgdDEgSU5ORVIgSk9JTiB0YWJsZTIgdDIgT04gKHQx
LmlkID0gdDIuaWQpCk9SREVSIEJZIHQxLk5BTUU7DQpFUlJPUjogIEZPUiBT
RUxFQ1QgRElTVElOQ1QsIE9SREVSIEJZIGV4cHJlc3Npb25zIG11c3QgYXBw
ZWFyIElOIFNFTEVDVApsaXN0DQpSSUdBIDE6IC4uLnQxIElOTkVSIEpPSU4g
dGFibGUyIHQyIE9OICh0MS5pZCA9IHQyLmlkKSBPUkRFUiBCWSB0MS5OQU1F
Ow0KIA0KU0VMRUNUIERJU1RJTkNUIHQxLiosdDIuKiBGUk9NIHRhYmxlMSB0
MSBJTk5FUiBKT0lOIHRhYmxlMiB0MiBPTiAodDEuaWQgPQp0Mi5pZCkgT1JE
RVIgQlkgdDEuTkFNRTsNCiBpZCB8IE5BTUUgfCBpZCB8IGhvbWUNCi0tLS0r
LS0tLS0tKy0tLS0rLS0tLS0tDQooMCByaWdoZSkNCg0KDQpTdXJlbHkgcXVl
cnkgbWF5IGJlIG1hZGUgc21hcnRlciBhbHdheXMgcXVhbGlmeWluZyBhdHRy
aWJ1dGVzIGluIFNFTEVDVCBsaXN0CmJ1dCBJIHRoaW5rIGl0IGlzIG1heSBi
ZSBjb25zaWRlcmVkIHZhbGlkIFNRTC4NCg0KT3IgaXQgaXMgdG8gYmUgY29u
c2lkZXJlZCBpbnZhbGlkIHNpbmNlICJuYW1lIiB3aXRob3V0IHF1YWxpZmlj
YXRpb24gaW4KU0VMRUNUIGlzIGNvbnNpZGVyZWQgbm90IGFuIGF0dHJpYnV0
ZSBvZiB0MSBidXQgYW4gYXR0cmlidXRlIG9mICIodDEgam9pbgp0MikiIGFu
ZCB0aHVzIHQxLm5hbWUgaXMgbm90IGluIHNlbGVjdCBsaXN0Pw0KCgo=
gabrimonfa@gmail.com writes:
> CREATE TABLE table1 (id integer primary key, name varchar);
> CREATE TABLE table2 (id integer primary key, home varchar);

> SELECT DISTINCT name FROM table1 t1 INNER JOIN table2 t2 ON (t1.id = t2.id)
> ORDER BY t1.name;
> ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
> SELECT DISTINCT name FROM table1 t1 INNER JOIN table2 t2 ON (t1.id = t2.id)
> ORDER BY name;
> [ok]

The reason for the discrepancy is that "t1.name" refers to an output
column of t1, while "name" refers to an output column of the unnamed JOIN.
While those are semantically equivalent in this particular case, they are
not so in general --- in particular, had this been a FULL JOIN, they
would definitely not be equivalent.  PG's parser treats them as different
variables and therefore sees "ORDER BY t1.name" as unrelated to the value
being distinct'ed on.

We might someday try to make the parser smarter about recognizing such
equivalences earlier, but I'm not terribly excited about it.

            regards, tom lane
On Tue, Jun 14, 2016 at 5:00 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

> gabrimonfa@gmail.com writes:
> > CREATE TABLE table1 (id integer primary key, name varchar);
> > CREATE TABLE table2 (id integer primary key, home varchar);
>
> > SELECT DISTINCT name FROM table1 t1 INNER JOIN table2 t2 ON (t1.id =
> t2.id)
> > ORDER BY t1.name;
> > ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select
> list
> > SELECT DISTINCT name FROM table1 t1 INNER JOIN table2 t2 ON (t1.id =
> t2.id)
> > ORDER BY name;
> > [ok]
>
> The reason for the discrepancy is that "t1.name" refers to an output
> column of t1, while "name" refers to an output column of the unnamed JOIN.
> While those are semantically equivalent in this particular case, they are
> not so in general --- in particular, had this been a FULL JOIN, they
> would definitely not be equivalent.  PG's parser treats them as different
> variables and therefore sees "ORDER BY t1.name" as unrelated to the value
> being distinct'ed on.
>
> We might someday try to make the parser smarter about recognizing such
> equivalences earlier, but I'm not terribly excited about it.
>

yes, it would probably not worth the effort.
Thank you for the explanation.
Best regards,

Gabriele Monfardini