2011-03-15 28 views
0

我有一個數據庫,其中有5個表,但我有問題。在裝運表中,有兩列,即來源和目的地,它們都是對路線表的外鍵引用,但是當我從裝運表中選擇一條記錄時,它只會爲兩者顯示相同的路線名。使用兩列具有相同的外鍵

下面是代碼:

SELECT fare, commission, driver,shipment._date, routename, vehiclenumber, productname, source, destination, routename,ownername 
FROM route, shipment, product, vehicle,owner 
WHERE vehicle.vehicleid = shipment.vehicle 
AND shipment.source 
and vehicle.owner=owner.ownerid 
AND shipment.destination = route.routeid 
AND shipment.product = product.productid 
AND vehicle.vehiclenumber = 'nk-234' 
ORDER BY _date 
LIMIT 0 , 30 
+0

您可以更新SQL嗎? 「並且shipment.source」似乎沒有任何結果。 –

+0

學習使用JOIN表示法。 –

回答

3

要在一個表(一個貨)在另一臺連接到記錄多個記錄(兩條路線),你會非常反對route表使用明確JOIN小號兩次(或更多,因爲你碰巧需要很多鏈接)。

下面是對您的查詢進行快速修改以演示使用情況。要特別注意在SELECT兩個routename列和兩個JOIN S到route表中FROM

SELECT fare, 
     commission, 
     driver, 
     shipment._date, 
     RS.routename, <-- field from first join 
     vehiclenumber, 
     productname, 
     source, 
     destination, 
     RD.routename, <-- field from second join 
     ownername 

FROM shipment 
JOIN route RS ON RS.routeID = shipment.source  <-- join 1; source 
JOIN route RD ON RD.routeID = shipment.destination, <-- join 2; destination 
    product, 
    vehicle, 
    owner 

WHERE vehicle.vehicleid = shipment.vehicle 
    AND vehicle.owner = owner.ownerid 
    AND shipment.product = product.productid 
    AND vehicle.vehiclenumber = 'nk-234' 

ORDER BY _date 

LIMIT 0 , 30 

很明顯,這可能不完全符合您的需求,因爲我不知道是什麼的表其他選定字段從能夠確保它們都佔了...

+0

嚴格地說,您可以很好地使用'FROM route AS rs,route AS rd ...',但JOIN表示法更好。 –

+0

你不需要使用顯式連接,但我確實同意他們讀得更好。 – araqnid

+0

好點。爲了準確,我已經調低了措詞。 – DMA57361

1

使用舊式(非首選)符號,你可以寫:

SELECT s.fare, s.commission, s.driver, s._date, v.vehiclenumber, p.productname, 
     s.source, s.destination, rs.routename, rd.routename, o.ownername 
    FROM route AS rs, route AS rd, shipment AS s, product AS p, vehicle AS v, owner AS o 
WHERE s.vehicleid = s.vehicle 
    AND s.source = rs.routeid 
    AND v.owner = o.ownerid 
    AND s.destination = rd.routeid 
    AND s.product = p.productid 
    AND v.vehiclenumber = 'nk-234' 
ORDER BY _date 
LIMIT 0, 30 

我不得不猜測哪些表包含票價,佣金和司機信息;我認爲他們都在發貨表中。

儘管大多數DBMS都允許,但在標準SQL中不允許使用下劃線開始列名。儘管如此,它看起來很醜陋。爲什麼不把'ship_date'作爲列名?

這是更好地使用顯式連接符號,不僅是因爲有較少忘記連接條件的機會:

SELECT s.fare, s.commission, s.driver, s._date, v.vehiclenumber, p.productname, 
     s.source, s.destination, rs.routename, rd.routename, o.ownername 
    FROM shipment AS s 
    JOIN route AS rs ON s.source  = rs.routeid 
    JOIN route AS rd ON s.destination = rs.routeid 
    JOIN vehicle AS v ON s.vehicleid = s.vehicle 
    JOIN owner AS o ON v.owner  = o.ownerid 
    JOIN product AS p ON s.product  = p.productid 
WHERE v.vehiclenumber = 'nk-234' 
ORDER BY s._date 
LIMIT 0, 30 
+0

非常感謝你,先生,現在它的工作。 – sadi

相關問題