2009-12-15 42 views
-1

我有3個表格:WATER_TENDER,ENGINE和TRAILER。一次抓取3個表格,只檢索與條件匹配的表格(SQL)

它們都具有EQ_ID作爲主鍵和一些其他屬性,對於每個表都不同。例如,EQ _ID ='WT-123'只在WATER _TENDER表內指向一行,而在其他表內沒有任何指示。

因爲我事先不知道EQ _ID,所以我不知道要查看哪張表,我該如何編寫一個基於EQ_ID檢查所有3個表的單個查詢,並檢索與該表匹配的表EQ _ID指定?

+0

我認爲 「只檢索其指定的?? EQ _ID匹配行」 更正確...... – Mirko

+0

您的努力將會更好地用於構建適當的表格和參考完整性。 –

回答

0

您可以使用UNION ALL來選擇所有錶行和選擇所有列,提供NULL當該列不存在:

SELECT a, b, c, d, e, f FROM (
    SELECT a, b, NULL AS c, NULL AS d, NULL AS e, NULL AS f FROM WATER_TENDER 
    UNION ALL 
    SELECT NULL AS a, NULL AS b, c, d, NULL AS e, NULL AS f FROM ENGINE 
    UNION ALL 
    SELECT NULL AS a, NULL AS b, NULL AS C, NULL AS D, e, f FROM TRAILER) AS T1 
WHERE _ID = @id 

這是一個有點髒不過,恕我直言。如果你必須這樣做,感覺你的設計有問題。

+0

這會起作用,但對於大量的數據我想它會造成相當的性能損失。 –

+0

如果您擔心性能,可以將WHERE子句引入到各個SELECT中。我想大多數數據庫會自動爲您執行此優化。 –

0

我不認爲你可以在正常的選擇查詢中做到這一點。如果可能的話,我建議你可以:

  1. 執行一些邏輯,讓你知道你應該看在哪個表(即「WT-」意味着你應該照照WATER_TENDER表)
  2. 進行3個獨立的查詢,1爲每個表
  3. 重新設計你的數據庫(可能有存儲的ID之間的關係,並記錄其他表主表)
1

如果您決定來解決模型中的位,你可以使用:

SELECT Type, a ,b ,c ,d ,e ,f ,g ,h 
FROM Equipment AS eq 
     LEFT JOIN ENGINE AS en ON en.EQ_ID = eq.EQ_ID 
     LEFT JOIN TRAILER AS tr ON tr.EQ_ID = eq.EQ_ID 
     LEFT JOIN WATER_TENDERER AS wt ON wt.EQ_ID = eq.EQ_ID 
WHERE eq.EQ_ID = 'WT-123' 

alt text http://www.damirsystems.com/dp_images/equipment_model_01.png

+0

+1超越問題並提供圖表。 –

相關問題