Реализация INTERSECT (INNER JOIN) в MS ACCESS

Я искал, как преобразовать то, что у меня есть как UNION, в INTERSECT, но в MS Access нет ключевого слова INTERSECT.

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

Я знаю, что могу достичь того, чего хочу, если ВЫБРАЮ DISTINCT, а затем использую внутреннее соединение, но ключевое слово ON меня действительно смущает.

Я только неделю назад начал работать с SQL, поэтому, если вы увидите что-то еще не так с кодом, я приму всю конструктивную критику :)

SELECT *
FROM (SELECT [Catt].[Name]
FROM [Catt]
WHERE ((([Catt].[Name]) Like "*" & [forms]![Main]![SrchText] & "*") 
AND [forms]![Main]!   [SrchText] IS NOT Null AND [forms]![Main]![SrchText]<>''  )

UNION

SELECT [Catt].[Name]
FROM [Catt]
WHERE  ((([Catt].[Category]) Like [forms]![Main]![Combo7].Value) AND (([forms]![Main]!    [SrchText] IS Null) OR ([forms]![Main]![SrchText]=''))))  AS Query
ORDER BY [Catt].[Name];

Спасибо.


person BadgerBeaz    schedule 08.05.2012    source источник
comment
Вы не можете объединиться или пересечься, если у вас нет такого же количества столбцов в поле зрения   -  person nawfal    schedule 08.05.2012
comment
О, так, поскольку я использую [Имя] и [Категория] в выбранных секундах, пересечение не будет работать? Дело в том, что Union работает на меня до сих пор, просто хотел пересесть на перекресток.   -  person BadgerBeaz    schedule 08.05.2012
comment
Да я получил его. я имел в виду, что вы не можете объединить Select * и Select catt.name. Я дам решение   -  person nawfal    schedule 08.05.2012
comment
возможный дубликат Как я могу реализовать SQL Операции INTERSECT и MINUS в MS Access   -  person Joe    schedule 15.08.2012


Ответы (1)


Не тестировал это, поэтому определенно вам придется внести много изменений, связанных с MS Access. Но я прошу вас не запутывать запрос, излишне цитируя каждый идентификатор в квадратных блоках:

SELECT     DISTINCT title
FROM       (  
            SELECT [Catt].[Name] as title
            FROM   [Catt]
            WHERE  ([Catt].[Name] Like "*" & [forms]![Main]![SrchText] & "*") AND 
                    [forms]![Main]![SrchText] IS NOT Null AND 
                    [forms]![Main]![SrchText] <>''
           ) AS view1

INNER JOIN 

           (   
            SELECT   [Catt].[Name]
            FROM     [Catt]
            WHERE    [Catt].[Category] Like [forms]![Main]![Combo7].Value AND 
                     ([forms]![Main]![SrchText] IS Null OR 
                      [forms]![Main]![SrchText]='')
           ) AS view2 ON view1.title = view2.Name

ORDER BY   view1.title

Но в основном что-то вроде этого помогает ...

Отредактировано, как указал Гордон

person nawfal    schedule 08.05.2012
comment
Мне кажется неправильным использование ORDER BY в подзапросе (view2). Если вы хотите ORDER BY, делайте это вне подзапросов. - person HansUp; 08.05.2012
comment
@HansUp Думаю, теперь все в порядке? - person nawfal; 08.05.2012
comment
Лучше. Спасибо за это форматирование ... делает его намного проще для чтения. Внесу некоторые изменения. Откатите мои изменения, если вы не согласны. - person HansUp; 08.05.2012
comment
@HansUp конечно, и я всегда могу сделать запрос кратким и быстрым, избегая тривиальных выборок, но я чувствовал, что оставлю его таким, чтобы OP понимал, как выполняется INTERSECT между двумя запросами. Помещение ORDER BY внутри подзапроса - одна из таких оптимизаций, которые я намеренно упустил, чтобы сделать запрос более понятным для OP. - person nawfal; 08.05.2012
comment
@HansUp мне нужен первый SELECT * из, а затем еще один внутренний запрос? Не могу я прямо написать: SELECT [Catt].[Name] FROM [Catt] WHERE ........ AS view1? - person nawfal; 08.05.2012
comment
Вы должны ВЫБРАТЬ что-то в каждом подзапросе. И родительский запрос, который использует подзапросы в качестве источников данных, также должен что-то ВЫБРАТЬ. Извините, я не понимаю ваш вопрос. - person HansUp; 08.05.2012
comment
@HansUp то, что я имел в виду: нужно ли нам писать это: SELECT * FROM ( SELECT [Catt].[Name] FROM [Catt] WHERE ....... ) AS view1. Или достаточно, если мы напишем: SELECT [Catt].[Name] FROM [Catt] WHERE .......... AS view1? Хорошо, давай проверим это - person nawfal; 08.05.2012
comment
@nawfal Ого, большое спасибо! Я попробую это сделать и вернусь с результатами. - person BadgerBeaz; 08.05.2012
comment
Можете ли вы ВЫБРАТЬ [Catt]. [Name] из view1 или view2? FROM [Catt] не будет доступен для запроса вне подзапросов. - person JeffO; 09.05.2012