TableA中的SELECT值(如果存在则为TableB)

时间:2012-03-22 12:20:03

标签: sql select

我有一张表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`

3 个答案:

答案 0 :(得分:1)

如果你没有在group by或aggregate中指定一个列,MySQL基本上会抓取一个colum的随机值。如果您使用max,则保证选择非空值(如果可用):

max(`ap_checklists`.`created_date`)

答案 1 :(得分:0)

哪里错误 - ap_checklistsap_id = 195应阅读

`product_checklists`.`ap_id` = 195

因为您过滤了左连接的右侧,并且有效地将左连接转换为内连接。

答案 2 :(得分:0)

你的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)