0

次のスクリプトを作成しました。

SELECT vil.account_id , 
       vil.imp_id, 
       vil.owner ,
       vil.start_date,  
       CASE  
         WHEN ac.status = 4  
         THEN status_date  
         ELSE NULL  
       END AS Live_date,
       cs.country_code  
  FROM ACCOUNT ac  
  INNER JOIN vu_imp_list vil  
     ON vil.account_id = ac.account_id  
  INNER JOIN entity e  
     ON ac.entity_id = e.entity_id  
  INNER JOIN country_specifics cs  
     ON e.country_id = cs.country_id  
WHERE ac.account_id IN
('000206789', '000207464', '000207696', '000207746')  
AND
(vil.start_date =  
(SELECT MIN(vils.start_date)
FROM vu_imp_list vils  
WHERE vil.account_id = vils.account_id) 

imp_idこれにより、それぞれの最も古いものが返されますaccount_id。ただし、 がないものは無視されますimp_id。テーブルにaccount_idsない人もいます。は、特派員とを持つレコードのみを抽出します。つまり、テーブルに対応するレコードが見つからない場合に、この条件を無視する方法です。MySQL関連のこの投稿を見つけましたが、エラーが発生し続けるため、何か問題があるようですimp_idvu_imp_listWHERE's second conditionstart_dateimp_idvu_imp_listmissing SELECT keyword

SELECT vil.account_id , 
       vil.imp_id, 
       vil.owner ,
       vil.start_date,  
       CASE  
         WHEN ac.status = 4  
         THEN status_date  
         ELSE NULL  
       END AS Live_date,
       cs.country_code  
  FROM ACCOUNT ac  
  INNER JOIN vu_imp_list vil  
     ON vil.account_id = ac.account_id  
  INNER JOIN entity e  
     ON ac.entity_id = e.entity_id  
  INNER JOIN country_specifics cs  
     ON e.country_id = cs.country_id  
WHERE ac.account_id IN
('000206789', '000207464', '000207696', '000207746')  
AND
((vil.start_date =  
(SELECT MIN(vils.start_date)
FROM vu_imp_list vils  
WHERE vil.account_id = vils.account_id))  
OR  
NOT EXISTS  
(vil.start_date = (SELECT MIN(vils.start_date)  
FROM obi.vu_implementation_list vils  
WHERE vil.ob10_account_id = vils.ob10_account_id)
4

1 に答える 1

1

私があなたを正しく理解していれば、必要なのはLEFT JOINwhen join ACCOUNTtable with VU_IMP_LISTand alter your condition inWHERE句で、スカラー サブクエリから返された値と等しい(対応するレコードが見つからない)start_dateかどうかを確認します。を使用すると、テーブルに対応するレコードがなくても、テーブルのすべてのレコードが返されます。NULLVU_IMP_LISTORLEFT JOINACCOUNTVU_IMP_LIST

SELECT vil.account_id , vil.imp_id, vil.owner , vil.start_date,
       CASE
         WHEN ac.status = 4 THEN status_date
         ELSE NULL
       END AS Live_date, cs.country_code
  FROM ACCOUNT ac
    LEFT JOIN vu_imp_list vil ON vil.account_id = ac.account_id
    INNER JOIN entity e ON ac.entity_id = e.entity_id
    INNER JOIN country_specifics cs ON e.country_id = cs.country_id
WHERE ac.account_id IN ('000206789', '000207464', '000207696', '000207746')
  AND (vil.start_date IS NULL
       OR vil.start_date = (SELECT MIN(vils.start_date)
                              FROM vu_imp_list vils
                            WHERE vil.account_id = vils.account_id))
;

さまざまな種類の結合について詳しくは、こちらをご覧ください: SQL 結合について

于 2013-10-24T12:02:41.733 に答える