我有两张表products
和product_edits
,其中包含有关价目表的产品信息。我的应用程序的工作方式是,如果用户更改products
表中的任何产品信息,则会将其插入product_edits
表...
产品表
pk|code|name |description|price|....
-----------------------------------
1 |QW1X|Product 1|...
2 |LW1X|Product 2|...
3 |DE1X|Product 3|...
PRODUCT_EDITS表
pk|product_id|code|name |description|price|....
-----------------------------------
1 | 2|LW1X|Product 2 new name|...
在上面的例子中,我想要一个从两个表中返回记录的SQL,但是如果在product_edits
表中找到了产品,它只从product_edits
中选择,而不是从products
表中选择。
我尝试使用standrd union但是从两个表中选择所有记录:
select code, name, description from products
union
select code, name, description from product_edits
答案 0 :(得分:1)
select code, name, description from products
where code not in(select code from product_edits)
union
select code, name, description from product_edits
答案 1 :(得分:1)
在这种情况下,最好使用EXISTS
代替IN
。
您希望搜索在找到匹配后停止,而不是覆盖product_edits
的所有结果。
所以这样做:
SELECT
code, name, description
FROM products p
WHERE NOT EXISTS (SELECT 1 FROM product_edits e WHERE e.code = p.code)
UNION
SELECT
code, name, description
FROM product_edits
答案 2 :(得分:-1)
您可以使用 IFNULL 功能 http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull
如果你的表是相关的,你可以尝试这样的事情:
SELECT
p.code, IFNULL(pe.name, p.name), IFNULL(pe.description, p.description)
from
products p
left join product_edit pe on (p.id = pe.product_id)
UNION
SELECT
pe2.code, pe2.name, pe2.description
from
product_edits pe2
第一部分将为您提供仅在产品表中的产品以及两个表中的产品,但产品为product_edits.description。
第二部分将为您提供仅在products_edits表中的产品,因为union将删除重复记录