簡體   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