2010-12-03 75 views
2

首先把事情的来龙去脉,我试图写SQL Server 2005的下面上搜索我的表结构加入 - SQL Server 2005中

Schema1.Table1 
GUID 
1 
2 
3 

Schema2.Table2 
GUID MAINTITLE 
1 Water Monkies 
2 Water Doggies 

Schema3.Table3 
GUID MAINTITLE 
3 Water Hyrdas 

预期的行为是用户将搜索“水”,我要取回所有的GUID在Schema1.Table1与Schema2.Table2和Schema3.Table3条目匹配它们其中GUID在列表中,MAINTITLE LIKE“%水份%”

我必须使用JOINS来实现这一点。

什么我迄今所做的是:

select Schema1.Table1.GUID 
from Schema1.Table1 JOIN Schema2.Table2 ON Schema1.Table1.GUID = Schema2.Table2.GUID 
JOIN Schema3.Table3 ON Schema1.Table1.GUID = Schema3.Table3.GUID 

但这返回AND后的结果,这让我没有结果

然后我试图

select distinct Schema1.Table1.GUID 
from Schema1.Table1, Schema2.Table2, Schema3.Table3 
where (Schema2.Table2.GUID=Schema1.Table1.GUID OR Schema3.Table3.GUID=Schema1.Table1.GUID 
) AND (Schema2.Table2.MAINTITLE like '%water%' OR Schema3.Table3.MAINTITLE like '%water%') 

但由于这是一个隐含的连接,它返回table2的所有行,其中table3的主键也像水一样。

我可以帮一下吗?

+2

你的CTO“恨联合查询”?一份新工作的时间。 – 2010-12-03 07:12:11

回答

1

这不可能通过连接来实现,你必须使用联合。虽然我不能提供这个

select T1.GUID 
from T1 join (T2 union all T3) as T on T1.GUID=T.GUID 
where T.MAINTITLE like '%WATER%' 

证明也许

+0

我想在接下来的几个时刻里试图卖给他。谢谢您的帮助! – 2010-12-03 07:35:53

1

您可以尝试使用LEFT JOINISNULL

select Schema1.Table1.GUID, 
     ISNULL(Schema2.MAINTITLE, Schema3.MAINTITLE) 
from Schema1.Table1 LEFT JOIN 
     Schema2.Table2 ON Schema1.Table1.GUID = Schema2.Table2.GUID LEFT JOIN 
     Schema3.Table3 ON Schema1.Table1.GUID = Schema3.Table3.GUID 
WHERE ISNULL(Schema2.MAINTITLE, Schema3.MAINTITLE) LIKE '%blabla%' 

一个UNION ALL似乎是一个更好的选择,但是这工作太。

也有看看使用的COALESCE (Transact-SQL)代替ISNULL

+0

这有效,但恼人的是,这可能会延伸到4或5或6表。在这种情况下,我最终会做一个ISNULL(ISNULL(ISNULL嵌套调用无穷大(除非我错了)。感谢您的帮助,真的很感激它! – 2010-12-03 07:35:02