2014-03-04 89 views
0

我有这个查询,它做它应该做的。 它发现表1中的所有记录与表2中的匹配,并且指定一个伪列值1. 然后它联合一个查询,检索表1中表2中没有匹配的所有记录,并指定一个伪列值为0. 这有效,但我相信可以以更有效的方式进行。需要建议formore漂亮sql查询

SELECT aplac.*, 1 AS selected 
FROM aux_placements aplac 
JOIN product_placements pplac 
ON pplac.placement_id = aplac.placement_id 
WHERE pplac.product_id = 1 
UNION 
SELECT distinct aplac.*, 0 AS selected 
FROM aux_placements aplac 
WHERE placement_id NOT IN 
    (SELECT aplac.placement_id 
    FROM aux_placements aplac 
    JOIN product_placements pplac 
    ON pplac.placement_id = aplac.placement_id 
    WHERE pplac.product_id = 1) 

我在想这样的事情可能工作:

SELECT aplac.*, 
     CASE WHEN aplac.placement_id IS NULL 
     THEN 0 
     ELSE 1 
     END AS selected 
FROM aux_placements aplac 
LEFT OUTER JOIN product_placements pplac 
ON pplac.placement_id = aplac.placement_id 
WHERE pplac.product_id = 1; 

任何建议表示赞赏。 在此先感谢

编辑:sqlfiddle是avaliable这里:http://sqlfiddle.com/#!2/57013a/1

+0

在你的第二个查询,更改WHERE到AND – Strawberry

回答

1
  1. 您想要的产品ID选择是连接条件的一部分 - 改变WHEREAND
  2. 您想检查连接是否在第二个表中找到匹配的记录 - 将aplac.placement_id更改为pplac.placement_id

所以接下来的查询会为你工作:

SELECT aplac.*, 
     CASE WHEN pplac.placement_id IS NULL 
     THEN 0 
     ELSE 1 
     END AS selected 
FROM aux_placements aplac 
LEFT OUTER JOIN product_placements pplac 
ON pplac.placement_id = aplac.placement_id 
AND pplac.product_id = 1; 
+0

就像一个魅力。感谢你们对我的帮助。 – Vercingetorix