MYSQL:两个 table 之间的 UNION 结果,如果在第二个 table 中找到 PK,则省略第一个 table 的记录
MYSQL: UNION results between two tables where omitting records from first table if PK found in second table
我有两个 table products
和 product_edits
,它们保存价目表上的产品信息。我的应用程序的工作方式是,如果用户更改 products
table 中的任何产品信息,它会将其插入 product_edits
table...
产品table
pk|code|name |description|price|....
-----------------------------------
1 |QW1X|Product 1|...
2 |LW1X|Product 2|...
3 |DE1X|Product 3|...
PRODUCT_EDITS table
pk|product_id|code|name |description|price|....
-----------------------------------
1 | 2|LW1X|Product 2 new name|...
在上述情况下,我想要一个 SQL,returns 从两个 table 记录,但是如果在 product_edits
table 中找到产品仅从 product_edits
中选择,而不从 products
table.
中选择
我尝试使用标准联合,但从 tables:
中选择了所有记录
select code, name, description from products
union
select code, name, description from product_edits
select code, name, description from products
where code not in(select code from product_edits)
union
select code, name, description from product_edits
在这种情况下,最好使用 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
您可以使用IFNULL函数
http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull
如果你的 table 是相关的,你可以尝试这样的事情:
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
第一部分将为您提供仅在产品 table 中的产品以及同时在 table 中但具有 product_edits.description.
的产品
第二部分会给你只有products_editstable的产品,因为union会去掉重复的记录
我有两个 table products
和 product_edits
,它们保存价目表上的产品信息。我的应用程序的工作方式是,如果用户更改 products
table 中的任何产品信息,它会将其插入 product_edits
table...
产品table
pk|code|name |description|price|....
-----------------------------------
1 |QW1X|Product 1|...
2 |LW1X|Product 2|...
3 |DE1X|Product 3|...
PRODUCT_EDITS table
pk|product_id|code|name |description|price|....
-----------------------------------
1 | 2|LW1X|Product 2 new name|...
在上述情况下,我想要一个 SQL,returns 从两个 table 记录,但是如果在 product_edits
table 中找到产品仅从 product_edits
中选择,而不从 products
table.
我尝试使用标准联合,但从 tables:
中选择了所有记录select code, name, description from products
union
select code, name, description from product_edits
select code, name, description from products
where code not in(select code from product_edits)
union
select code, name, description from product_edits
在这种情况下,最好使用 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
您可以使用IFNULL函数 http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull
如果你的 table 是相关的,你可以尝试这样的事情:
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
第一部分将为您提供仅在产品 table 中的产品以及同时在 table 中但具有 product_edits.description.
的产品第二部分会给你只有products_editstable的产品,因为union会去掉重复的记录