2017-09-08 35 views
1

考慮一個表是飛行員的實體,其中一個是布爾型的「NewPilot」。如果飛行員是新飛行員,那麼他/她不會飛行任何飛行(另一張桌子)。現在我想要定義飛行員和飛行之間的關係,即Pilot.NewPilot = False與飛行有着一對多的關係。基於布爾實體的SQL關係(圖表視圖)

+0

你的模式是多餘的 - 你可以從飛行表中導出NewPilot的值。如果您出於性能原因需要保留一個單獨的字段,我建議您改爲記錄NumberOfFlights,並在Flight表上創建觸發器以使其保持同步。 – reaanb

回答

0
SELECT DISTINCT pilot.*, 
    CASE when flight.pilot_id is NULL then TRUE 
    else FALSE end as new pilot 
FROM pilot 
LEFT JOIN flights 
on flight.pilot_id = pilot.id 

會像甲骨文中的魅力一樣工作。試試吧,讓我知道它是否也適用於MySQL。

...如果不是會提供備用。

泰德。

+1

MySQL沒有'nvl2()'函數,但是如果需要的話,可以使用'coalesce()'和其他聚合函數。 – Denniselite

+0

謝謝@ Denniselite,我選擇了易於閱讀的案例。 –

0

對於MySQL或PostgreSQL,你可以使用的東西喜歡:

SELECT 
    DISTINCT pilots.id, 
    CASE WHEN 
    flights.pilot_id IS NULL 
    THEN 
    TRUE ELSE FALSE END AS is_new_pilot 
FROM pilots 
    LEFT JOIN flights ON flights.pilot_id = pilots.id; 

凡is_new_pilot是關於新的試驗標記。我希望它可以幫助你

+0

有點難讀,不是?! –

+0

哪裏?在「CASE」部分?其實,我認爲這是一個正常的閱讀,但我會修復它一點 – Denniselite

+0

沒有我的意思是:總結(coalesce(flights.pilot_id,0))= 0 –