Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有相同列和相同where子句的两个表的并集_Sql_Sql Server 2008 - Fatal编程技术网

Sql 具有相同列和相同where子句的两个表的并集

Sql 具有相同列和相同where子句的两个表的并集,sql,sql-server-2008,Sql,Sql Server 2008,我在两个不同的位置有两个SQL表,它们包含完全相同的字段,只是不同的数据,所有的SKU都是唯一的。我想连接这些表,并对结果运行一个复杂的WHERE子句,以用于日志记录 我已经准备好了,但它看起来非常多余,我来自C背景 select sku, catalogname, getDate() from uswebdb.commerce.catalogproducts where sku is not null and (CategoryName is not null or ParentOID = 1

我在两个不同的位置有两个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中可能吗?我是不是真的想得太多了?

这些是在不同的服务器上还是在不同的数据库上,因为它们有很大的不同。您的语法意味着它们位于同一台服务器、不同的数据库上,这意味着您可以将数据移动到以下位置:


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

您提出了一个合理的问题,但首先,让我们澄清一下术语。UNION和JOIN是完全不同的操作类型:第一种操作,即使用的UNION垂直合并两个表,而JOIN水平扩展。您的SQL语句似乎是正确的,尽管从您的角度来看它有点多余。我建议在完全按照实现方式合并之前,从两个表中筛选出行。唯一值得尝试的修改是使用UNION,而不是UNION ALL NOR DUPLICAES。

假设这两个表位于两个不同位置的服务器上,则尽可能使用筛选实现查询非常重要。虽然优化器可能会这样做,但为什么要冒险呢?只需按照需要编写的方式编写查询。我认为它来自一种面向对象的思维,我从不想编写同一个函数两次,即使这可能会提高性能。看到完全相同的Select和Where子句像那样重复似乎。。。错误的也许这与强迫症的关系比OOP更大SQL是如此强大,而且通常是如此简洁,以至于我不必时不时地为它的枯燥而烦恼。我感谢您的澄清!对DB这件事还是很新鲜的,没关系!你做的一切都对。顺便说一句,这是一个非常有效的问题。祝你的项目好运。对-不为空是多余的。我把它取下来。
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]%')