2

我在两个不同的位置有两个 SQL 表,它们包含完全相同的字段,只是不同的数据(所有唯一的 SKU)。我想加入这些表并在结果上运行一个复杂的 WHERE 子句以用于记录目的。

我所拥有的东西有效,但它看起来非常多余(我来自这里的 C# 背景)。

select sku, catalogname, getDate()
from uswebdb.commerce.catalogproducts
where sku is not null
and (CategoryName is not null or ParentOID = 113)
and (sku not like '%[a-z]%')
union all
select sku, catalogname, getDate()
from ukwebdb.commerce.catalogproducts
where sku is not null
and (CategoryName is not null or ParentOID = 113)
and (sku not like '%[a-z]%')

有没有更简洁的方法来连接这两个表并产生相似的结果,或者这是最好的方法?选定的字段将始终相同,但在不久的将来,涉及的表数量和 where 子句的复杂性可能会增加。

我想理想情况下我希望看到这样的东西:

select sku, catalogname, getDate() from
uswebdb.commerce.catalogproducts
--magic join/union--
ukwebdb.commerce.catalogproducts
-- more joins...--
where sku is not null
and (CategoryName is not null or ParentOID = 113)
and (sku not like '%[a-z]%')

这在 SQL2008 中甚至可能吗?我真的只是想太多了吗?

4

2 回答 2

2

这些是在不同的服务器上还是在不同的数据库上,因为它有很大的不同。您的语法意味着在同一台服务器上,不同的数据库,这意味着您可以移动WHERE外部:

select sku, catalogname, getdate()
from
(
select sku, catalogname, categoryname, parentOID
from uswebdb.commerce.catalogproducts
union all
select sku, catalogname, categoryname, parentOID
from ukwebdb.commerce.catalogproducts
) F
where (F.CategoryName is not null or F.ParentOID = 113)
and (F.sku not like '%[a-z]%')

您应该使用 CTRL-L 来查看查询计划是否不同。可能会对性能产生影响。

于 2013-05-09T23:19:43.497 回答
1

您提出了一个合理的问题,但首先,让我们澄清一下术语。UNION并且JOIN是完全不同类型的操作:您使用的第一个(即UNION)“垂直”合并 2 个表,同时JOIN“水平”扩展。您的 SQL 语句似乎是正确的,即使它看起来有点多余(从您的角度来看)。我建议在合并之前从两个表中过滤掉行(完全按照它的实现方式)。唯一值得尝试的修改是使用UNION而不是UNION ALL(没有重复)。

于 2013-05-09T23:24:11.307 回答