SELECT * join

时间:2016-01-09 02:05:50

标签: mysql sql join alias

我有两张桌子 - 客户和人。它们在两个表中都由personID链接。

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

我试过了:

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

它不喜欢说Duplicate column name 'personID

我想如果你使用table.column作为标识符就可以了。我尝试使用和不使用单引号。

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

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

编辑:这是一个特别关于SELECT * join中别名列的问题。每个人似乎都在说出明确的专栏。我知道该怎么做。我特意想用* JOIN进行开发工作。这将是一个很小的数据库,所以如果它保持不变甚至无关紧要。哦和这只是一个问题,存储为VIEW而不是SQL查询或一些代码

4 个答案:

答案 0 :(得分:2)

看起来你必须使用别名为你的列名称命名。

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;

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

有什么问题

在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)

USING在大多数数据库(包括MySQL)中都有很好的效果,只能在结果记录中生成一次连接列,而与它所生成的表无关。

关于SELECT *的一般说明

但是,一般情况下,您不应在视图中使用SELECT *,而应明确列出并将所有列命名为suggested by wmehanna或在我之前的注释中。您应省略SELECT *

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