[英]Left Join base on CASE
我想在MySQL中進行Left Join。 聯接基於條件。 例如,如果值為328
,則use Left Join <table A>
ELSE使用Left Join <table B>
以下是查詢:
SELECT * FROM applications app
CASE
WHEN
app.application_type = 328
THEN
LEFT JOIN application_individu ai
ON app.id = ai.application_id
ELSE
LEFT JOIN application_org ao
ON app.id = ao.application_id
END
WHERE app.id=11
我在phpmyadmin
上收到錯誤消息
#1064 - You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax to use near
'(CASE WHEN app.application_type = 328 THEN
LEFT JOIN application_individu a' at line 5
1.我們可以使用CASE
加入嗎?
2.如果可能的話,如何正確地做?
更新資料
以下是示例數據。
應用
id application_type app_reference applicant_type status created_date
1 330 ZAK00001 328 1 2019-01-16 16:45:14
2 330 ZAK00002 328 1 2019-01-17 12:31:14
3 330 ZAK00003 329 2 2019-01-17 14:31:40
application_individu
id application_id name age gender contactNo ic
1 1 Ali 30 Male 1234 12345678
2 2 Chan 45 Male 1234 54321
application_org
id application_id companyName companyRegNo picName picContactNo companyEmail
1 3 My StartUp x-123Y Raja 01035562 example@mystartup.com
參數
id parameterValue detail
1 328 Personal
2 329 Company
3 1 Complete
4 2 Pending
這是我不使用CASE
更新查詢。
SELECT * FROM applications app
LEFT JOIN application_individu ai ON app.id=ai.application_id
LEFT JOIN application_org ao ON app.id=ao.application_id
LEFT JOIN parameters param ON app.applicant_type=param.main_id
LEFT JOIN parameters param2 ON app.status=param2.main_id
LEFT JOIN parameters param3 ON app.applicant_type=param3.main_id
LEFT JOIN parameters param4 ON app.status=param4.main_id
有沒有辦法檢查應用程序是“ Personal
還是“ Company
這樣我就不會在連接上重復參數。
你可以用工會
SELECT app.* FROM applications app
LEFT JOIN application_individu ai
ON app.id = ai.application_id
where app.application_type = 328
union
SELECT app.* FROM applications app
LEFT JOIN application_org ao
ON app.id = ao.application_id
where app.application_type != 328
您應該將邏輯放在ON
子句中。 並記住在SELECT
使用COALESCE()
:
SELECT a.*,
COALESCE(ai.name, ao.name) as name
FROM applications a LEFT JOIN
application_individu ai
ON a.id = ai.application_id AND
a.application_type = 328 LEFT JOIN
application_org ao
ON a.id = ao.application_id AND
a.id = 11;
當您引用多個表時,請不要使用SELECT *
。 至少,當列在不同表中具有相同名稱時,您將有命名沖突-在這種情況下很可能會發生命名沖突。
要有條件地聯接表,僅意味着在SQL中對其進行外部聯接。 因此,結果行中將包含一個信息或另一個信息。 最終您將得到一個查詢,就像您添加到請求中的查詢一樣。
在我看來,組合參數表沒有任何意義。 取而代之的是有一個狀態表和一個subscriber_type表,因此您可以應用適當的外鍵並知道哪個是外鍵。
查詢如下所示:
SELECT
app.app_reference, created_date, s.status_text, apt.type_text,
ai.name, ai.age,
ao.companyName, ao.companyRegNo
FROM applications app
INNER JOIN status s ON s.id = app.status_id
INNER JOIN applicant_type apt on apt.id = app.applicant_type_id
LEFT JOIN application_individu ai ON app.id = ai.application_id
LEFT JOIN application_org ao ON app.id = ao.application_id;
您可以在下面嘗試-使用左連接並在ON封閉條件中應用條件
SELECT * FROM applications app
left join application_individu ai ON app.id = ai.application_id
and app.application_type = 328
LEFT JOIN application_org ao ON app.id = ao.application_id
WHERE app.id=11
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.