繁体   English   中英

SELECT *连接上列名的别名

[英]Alias for column name on a SELECT * join

我有两个表-客户和个人。 它们在两个表中均由personID链接。

我正在尝试创建一个视图。

我试过了:

SELECT * FROM client INNER JOIN person ON client.personID = person.personID

它不喜欢说Duplicate column name 'personID

我想如果您使用table.column作为标识符很好。 我尝试使用单引号和不使用单引号。

如果我想要特定的列EG client.personID AS perID ,我可以做一个别名,但是当它们是JOIN定义的一部分时,我client.personID AS perID如何为此位置IE中的列做别名。

我一直在寻找并尝试了一个多小时,但找不到它。

编辑:这是一个关于SELECT *联接中别名列的特定问题。 每个人似乎都说放在显式列中。 我知道该怎么做。 我故意要使用* JOIN进行开发工作。 这将是一个很小的数据库,因此即使它留在里面也不重要。哦, 这只是一个问题,以VIEW的形式存储,而不是以SQL查询或少量代码的形式存储

看来您必须使用别名为您的列名加上别名。

SELECT client.column1 as col1, client.column2 as col2, person.column1 as colp1 FROM client INNER JOIN person ON client.personID = person.personID

当然,将列名称替换为真实的列名称,因为使用更具吸引力的别名

让我们知道是否有帮助

更新#1

我尝试在mySQL 5.5和5.6中使用sqlfiddle创建2个表

看到链接: http : //sqlfiddle.com/#!9/e70ab/1

它按预期工作。

也许您可以共享表架构。

这是示例代码:

CREATE TABLE Person
(
personID int,
  name varchar(255)
);

CREATE TABLE Client
(
ID int,
  name varchar(255),
personID int
);

insert into Person values(1, 'person1');
insert into Person values(2, 'person2');
insert into Person values(3, 'person3');

insert into Client values(1, 'client1', 1);
insert into Client values(2, 'client2', 1);
insert into Client values(3, 'client1', 1);

SELECT * FROM client 
INNER JOIN person 
ON client.personID = person.personID;
SELECT
        c.*,
        p.`all`,
        p.need,
        p.`fields`,
        p.`of`,
        p.person,
        p.`table`,
        p.without,
        p.personID_field
    FROM client c
    INNER JOIN person p
        ON p.personID = c.personID

尝试指定要显示的所有列名,而不是使用*列出列名以及两个表共有的表名,例如不要说personID,键入client.personID

问题是什么

在SQL中,顶级SELECT语句允许两次产生相同的列名。 嵌套的SELECT ,派生表或视图的任何形式都必须产生唯一的列名。 这就是为什么联接两个表并仅从表中选择所有列会在视图中产生问题的原因。

通常,人们会通过公认的前缀命名约定对视图中的所有列添加前缀。

CREATE VIEW v_client_person AS
SELECT
  client.clientID AS clie_clientID,
  client.name     AS clie_name,
  client.personID AS clie_personID,
  person.personID AS pers_personID,
  person.name     AS pers_name
FROM ...

这是一个好主意,因为您可以轻松地从这种视图中消除任何列的歧义。

解决方法

如果personID是两个表之间唯一的冲突列,则可以使用JOIN .. USING作为解决方法:

CREATE VIEW v_client_person AS
SELECT * FROM client INNER JOIN person USING (personID)

在包括MySQL在内的大多数数据库中, USING都具有很好的效果,即在生成的记录中仅产生一次join列,而与它源自哪个表无关。

关于SELECT *的一般说明

但是,一般而言,您不应在视图中使用SELECT * ,而应按照wmehanna的建议或在我之前的注释中明确列出并命名所有列。 有几个原因您应该省略SELECT *

  • 在顶级选择中: 性能 (如果顶级选择未选择嵌套选择的所有列,则在嵌套选择中可能不是这样的问题)
  • 在视图(包括派生表)中:视图定义取决于列的存储顺序及其名称。 当表列更改时,您的视图定义将过时,并且行为有些不确定。 通常,最好控制您的查询输出,这就是为什么SELECT *不一定是一个好主意的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM