簡體   English   中英

基於CASE的左聯接

[英]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.

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