我有两个产品表,让我们说current_products
和historical_products
,具有相同的结构,以及product_code
字段中的一个键。
我必须在这些表格中搜索产品清单以便进一步处理。
我发现的简单解决方案如下:
SELECT u.*
, u.calculated_fields
, t.other_fields
FROM (
SELECT * FROM current_products
UNION
SELECT * FROM historical_products
) u
JOIN other_tables t
WHERE u.product_code = 'some_prodcut_code'
PROS:DRY
缺点:表现不佳
性能不是最好的,所以我想创建一个这样的条件查询:
IF EXISTS (select * from current_products WHERE product_code = 'some_prodcut_code')
BEGIN
SELECT u.*
, u.calculated_fields
, t.other_fields
FROM current_products u
JOIN other_tables t
WHERE u.product_code = 'some_prodcut_code'
END
ELSE IF EXISTS (select * from historical_products WHERE product_code = 'some_prodcut_code')
BEGIN
SELECT u.*
, u.calculated_fields
, t.other_fields
FROM historical_products u
JOIN other_tables t
WHERE u.product_code = 'some_prodcut_code'
END
PROS:更好的表现
缺点:不干嘛
问题
还有第三种方法吗?
答案 0 :(得分:1)
性能会因为你首先从两个表中提取所有记录而杀死你,然后应用where条件...尝试更改为
FROM (
SELECT * FROM current_products
WHERE product_code = 'some_prodcut_code'
UNION
SELECT * FROM historical_products
WHERE product_code = 'some_prodcut_code'
) u
JOIN other_tables t
这样,内部查询可以对基础产品表的索引起作用(假设您在第一个位置的product_code上有索引,或者您可能还想要应用其他标准)。