2016-11-10 102 views
0

我有兩個表BOOKINGS和WORKER。基本上有一張桌子可供工作人員和一張桌子用來跟蹤工作人員在預訂時間段內必須做的事情。我試圖檢查是否有可用的工作人員進行工作,因此我查詢了預訂,以檢查在起始結束日期之間是否有可用的工作人員。但是,我陷入了下一部分。這是返回確實有可用時間的工作人員名單。我讀到我可以加入在共享列上傳遞的表,所以我嘗試使用WORKER_NAME列進行內部聯接,但是當我嘗試執行此操作時,我得到一個模糊的錯誤。這讓我相信我誤解了這個概念。有誰知道我在做什麼,知道如何去做,或者知道爲什麼我有下面的錯誤。多謝你們 !!!!SQL - 字段列表中的列不明確

CREATE TABLE WORKER (
      ID INT NOT NULL AUTO_INCREMENT, 
      WORKER_NAME varchar(80) NOT NULL, 
      WORKER_CODE INT, 
      WORKER_WAGE INT, 
      PRIMARY KEY (ID) 
) 

CREATE TABLE BOOKING (
      ID INT NOT NULL AUTO_INCREMENT, 
      WORKER_NAME varchar(80) NOT NULL, 
      START DATE NOT NULL, 
      END DATE NOT NULL, 
      PRIMARY KEY (ID) 
) 

查詢

SELECT * 
FROM WORKERS 
INNER JOIN BOOKING 
ON WORKER_NAME = WORKER_NAME 
WHERE (START NOT BETWEEN '2010-10-01' AND '2010-10-10') 
ORDER BY ID 

#1052 - 對條款列 'WORKER_NAME' 不明確

回答

3

在您的查詢中,列 「WORKER_NAME」 在兩個表中是否存在;在這種情況下,您必須引用表名作爲列標識符的一部分。

SELECT * 
FROM WORKERS 
INNER JOIN BOOKING 
ON workers.WORKER_NAME = booking.WORKER_NAME 
WHERE (START NOT BETWEEN '2010-10-01' AND '2010-10-10') 
ORDER BY ID 
+1

ORDER BY工人.ID – John

+0

生成的查詢將兩個表組合成一列,有沒有辦法獲得匹配的工作列?例如 ID WORKER_NAME \t WORKER_CODE \t WORKER_WAGE \t ID \t WORKER_NAME \t START \t END – John

+0

由於並非所有的列都包含在兩個表中,我會說沒有 - 事實上,我不知道這個問題是有道理的。它如何將這兩個表組合成一列?你想要兩行,每個表一個? –

1

在您的查詢中,列WORKER_NAMEID列存在兩個表中,其中WORKER_NAME保留了相同的意思,ID重新定意;在這種情況下,您必須指定您正在使用WORKER_NAME作爲連接搜索條件或'重新投放'(重命名或省略)重複的ID問題。

因爲ID列是AUTO_INCREMENT,我假設(希望!)他們沒有商業意義。因此,它們都可以被省略,從而允許自然連接,這會導致重複的列被「投射出去」。這是希望SQL有WORKER (ALL BUT (ID))類型語法的情況之一;相反,一個人需要做到這一點。從長遠來看,選擇一致的命名約定並將列分別重命名爲WORKER_IDBOOKING_ID可能會更容易。

您還需要確定一個商業密鑰,以在例如, (START, WORKER_NAME)

SELECT * 
    FROM 
    (SELECT WORKER_NAME, WORKER_CODE, WORKER_WAGE FROM WORKER) AS W 
    NATURAL JOIN 
    (SELECT WORKER_NAME, START, END FROM BOOKING) AS B 
    WHERE (START NOT BETWEEN '2010-10-01' AND '2010-10-10') 
    ORDER BY START, WORKER_NAME; 

這是一件好事,但它的返回開始和結束時間爲好。我只是想要沃克斯隊。我不能採取開始和結束,因爲然後SQL不承認where子句。

兩種方法涌現在腦海裏:推where子句的子查詢:

SELECT * 
    FROM 
    (SELECT WORKER_NAME, WORKER_CODE, WORKER_WAGE FROM WORKER) AS W 
    NATURAL JOIN 
    (SELECT WORKER_NAME, START, END 
     FROM BOOKING 
    WHERE START NOT BETWEEN '2010-10-01' AND '2010-10-10') AS B 
    ORDER BY START, WORKER_NAME; 

或者,列清單替代SELECT *SELECT

SELECT WORKER_NAME, WORKER_CODE, WORKER_WAGE 
    FROM 
    (SELECT WORKER_NAME, WORKER_CODE, WORKER_WAGE FROM WORKER) AS W 
    NATURAL JOIN 
    (SELECT WORKER_NAME, START, END FROM BOOKING) AS B 
    WHERE START NOT BETWEEN '2010-10-01' AND '2010-10-10' 
    ORDER BY START, WORKER_NAME; 
+0

這其實就是我正在尋找的東西。謝謝。 – John

+0

這很好,但它也會返回開始和結束時間。我只是想要沃克斯隊。我不能採取開始和結束,因爲然後SQL不承認where子句。 – John

+0

@John:查看問題的更新。 – onedaywhen