2010-12-03 2 views
2

Во-первых, чтобы положить вещи в контексте я пытаюсь написать поиск по SQL Server 2005. Ниже моя структура таблицыРегистрация на столах с OR (повторяющимися данными) - 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, например «% WATER%»

I должны достичь этого, используя 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 

но это возвращает результат, который не объединяются операцией И. дает мне никаких результатов

я попытался

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%') 

, но так как это является подразумеваемым соединением, он возвращает все строки таблицы2, где maintitle table3s подобен воде.

Могу ли я найти какую-нибудь помощь?

+2

Вашего КОТА «ненавидит накидные запросы»? Время для новой работы. – 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 JOIN и ISNULL

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

Смежные вопросы