假設我有一個名爲類型創建基於列枚舉值SQL語句
根據該行的枚舉列正常化稱爲表(假設的類型是A,B或C)我想根據任何類型進行LEFT JOIN。
所以,如果type = A,LEFT JOIN ON表..如果類型= B,LEFT JOIN的表B ...等等
可以這樣有效地完成?或者應該在應用層完成?
假設我有一個名爲類型創建基於列枚舉值SQL語句
根據該行的枚舉列正常化稱爲表(假設的類型是A,B或C)我想根據任何類型進行LEFT JOIN。
所以,如果type = A,LEFT JOIN ON表..如果類型= B,LEFT JOIN的表B ...等等
可以這樣有效地完成?或者應該在應用層完成?
是的,你應該能夠做這樣的事情:
SELECT *
FROM parent
LEFT JOIN a ON (type = 'a' AND parent.id = a.id)
LEFT JOIN b ON (type = 'b' AND parent.id = b.id)
LEFT JOIN c ON (type = 'c' AND parent.id = c.id)
根據實際數據和DBMS的智能程度(利用PK下應存在的索引),您可能需要也可能不需要type
索引。無論如何,在實際的數據量上測量。
一種常見的方法是將該類型存儲爲1:1關係。在這種方法中,沒有類型的枚舉列。 ID在1:1擴展表中存在的事實表明它的類型。
select *
from BaseTable b
left join
Type1Table t1
on t1.Id = b.Id
left join
Type1Table t2
on t2.Id = b.Id
所以在b
和t1
條目中的實體必須是類型1.條目的實體的b
和t2
是2型這樣,信息只存儲一次,並且不一致的地方表格會說「類型1」,但t1
中沒有匹配的行是不可能的。
問題是,即使您使用SELECT table1.* FROM table1 LEFT OUTER JOIN table2
,引擎也會評估連接,即使您甚至不需要顯示它們。
所以,在我看來,有2個選項:
**見下文,WITHIN THE LIST IT BUGS **
解釋計劃也可以給你的,你在做什麼一個很好的線索
查詢:
SELECT
IF(t.type = a, ta.value,
IF(type = b, tb.value, IF(type = c, tc.value, td.value))
)
FROM
table t
LEFT JOIN type_a_table ta ON t.type = a AND ...
LEFT JOIN type_a_table tb ON t.type = b AND ...
LEFT JOIN type_a_table tc ON t.type = c AND ...
LEFT JOIN type_a_table td ON t.type = d AND ...
爲什麼SQL不顯示爲代碼!*%& – Sebas
不知道這是否會有所幫助,但我可能會使用一個工會執行什麼您正在尋找
select *
from BaseTable b left join TypeTableA a on b.id = a.id
union
select *
from BaseTable b left join TypeTableB b on b.id = b.id
不幸的是,如果'TypeTableA'和'TypeTableB'有不同的列(這可能是整個點),這將不起作用。你也有一個語法錯誤:你爲兩個不同的表使用相同的別名('b')。 –
謝謝,這有很大的幫助 – volk