簡體   English   中英

根據表字段收集來自不同表的值

[英]Gather values from different tables based on a table field

假設我具有以下表結構:

  • 表格1

main_id | 類型 信息

first segway excellent
second car   mercedes
third  bike  sliceofwind
  • 表賽格威

id | 年級

1  excellent
2  bad
3 (...)
  • 台式車

id |

1  mercedes
2  honda
3  (...)
  • 桌上自行車

id | 輪胎

1 sliceofwind
2 flatasfaque
3 (...)

我想做的是根據table1的類型從不同的表中獲取信息。

這是我嘗試過的查詢的一般示例

SELECT (CASE 
WHEN table1.type = 'segway' AND segway.grade = table1.information 
     THEN segway.id,
WHEN table1.type = 'car' AND car.brand = table1.information 
     THEN car.id,
WHEN table1.type = 'bike' AND bike.tires = table1.information 
     THEN bike.id 
        END) AS information 
FROM table1,segway,bike,car WHERE table1.main_id IN ("ids")

該查詢的結果是笛卡爾積,因為盡管案例內部存在限制,但仍會檢索所有表中的所有數據,因為並非所有表都具有限制。 我想知道是否有一種方法可以解決此問題而無需更改表結構,是否不希望獲得一些提示! (我要處理一些古怪的sql東西,我在這里問的是,是否確實可以做到這一點,盡管有人建議還是不建議這樣做,為什么!)。

這可能是做到這一點的一種方法。

SELECT t1.*
FROM table1 t1
LEFT JOIN segway s 
  on T1.main_id = s.id and T1.type= 'segway'
LEFT JOIN car c 
  on T1.main_id = c.id and T1.type= 'car'
LEFT JOIN bike b
  on T1.main_id = b.id and T1.type= 'bike'
WHERE t1.main_ID in (SomeList)

當Table1的類型不匹配時,segway,car和bike表的列將為null。 但是,這似乎會給您帶來比您所需更多的數據/列。 我認為您最好在數據庫外編寫單獨的查詢,然后根據它們選擇的值來調用它們。 或使用數據庫中的過程和條件邏輯返回所需的結果集。 (再次在數據庫中使用3個獨立的查詢和條件邏輯),但在不了解用例的情況下,我無法真正說出哪種效果更好。

我們可以將品牌,輪胎和等級進一步合並為“價值”字段,如下所示

Select t1.*, coalese(s.grade,c.brand,b.tires) as value但我不確定這是否也有幫助。

如果我們只需要返回表1的值並從其他表中設置值...您說的是怪癖,而不是我。

我看不到笛卡爾會怎樣發生。

這將是您的預期結果,請嘗試此查詢。

SELECT (CASE WHEN s.`id` IS NOT NULL THEN s.`id` 
 WHEN c.`id` IS NOT NULL THEN c.`id` 
 WHEN b.`id` IS NOT NULL THEN b.`id` 
END) AS information FROM table1 AS t1
 LEFT JOIN segway s ON t1.type= 'segway'
 LEFT JOIN car c ON t1.type= 'car'
 LEFT JOIN bike b ON t1.type= 'bike' 
WHERE t1.main_ID IN (1, 2, 3) AND (t1.information = s.`grade` OR 
                                   t1.`information`=c.brand OR 
                                   t1.`information`=b.tires);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM