[英]SELECT values from TableA (and TableB if exists)
我有一個表product_checklist
,其中包含檢查清單項目。 我想一直抓住它,但是如果表ap_checklists
的ap_id存在任何列表項,那么抓住created_date
下面的當前聲明需要對可能的優先級進行某種優先級選擇? 有可能在一個查詢中做到這一點嗎?
SELECT
`product_checklists`.*,
`ap_checklists`.`ap_id`,
`ap_checklists`.`created_date`
FROM (`product_checklists`)
LEFT OUTER JOIN
`ap_checklists` ON `product_checklists`.`check_id` = `ap_checklists`.`check_id`
WHERE
`ap_checklists`.`ap_id` = 195 OR `product_id` = 3
GROUP BY
`product_checklists`.`check_process` ORDER BY `product_checklists`.`check_order`
如果您未在group by中指定列或在匯總中指定列,則MySQL本質上會獲取列的隨機值。 如果使用max
則保證選擇一個非空值(如果可用):
max(`ap_checklists`.`created_date`)
哪里有問題ap_checklists
。 ap_id
= 195應該讀
`product_checklists`.`ap_id` = 195
因為您過濾了左聯接的右側,並且有效地將左聯接轉換為內部聯接。
您的where子句有一個錯誤,因為您使用的是左聯接表,因此不應
如果您想用標准SQL編寫它,則應為:
FROM (`product_checklists`)
LEFT OUTER JOIN `ap_checklists` ON `product_checklists`.`check_id` = ap_checklists`.`check_id` AND (`ap_checklists`.`ap_id` = 195 OR `product_id` = 3)
在Oracle的SQL中,您可以將其編寫為:
FROM `product_checklists`, `ap_checklists`
WHERE `product_checklists`.`check_id` =(+) `ap_checklists`.`check_id`
AND (`ap_checklists`.`ap_id` (+)= 195 OR `product_id` = 3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.