ms-access: выбрать из другого запроса - PullRequest
0 голосов
/ 31 августа 2009

Я подключаю доступ к базе данных MySQL.

Мне нужно собрать два утверждения и сделать их одним.

например:

SELECT 
  users.id,
  users.first,
  users.last,
  chavrusas.luser_type AS user_type,
  chavrusas.id, 
  users.title, 
  users.city, 
  users.state, 
  users.home_phone, 
  users.email
FROM users
INNER JOIN chavrusas 
  ON Users.id=chavrusas.luser_id
WHERE     ((chavrusas.ruser_id)='3166' and chavrusas.ended=false) 
  AND     (chavrusas.luser_type) <> (chavrusas.ruser_type)
  AND NOT ((chavrusas.luser_type)='teacher' AND (chavrusas.ruser_type)='student')
  AND NOT ((chavrusas.ruser_type)='teacher' AND (chavrusas.luser_type)='student'); 
UNION
SELECT  
  users.id, 
  users.first, 
  users.last, 
  chavrusas.ruser_type AS user_type, 
  chavrusas.id, 
  users.title, 
  users.city, 
  users.state, 
  users.home_phone, 
  users.email
FROM users
INNER JOIN chavrusas 
  ON Users.id=chavrusas.ruser_id
WHERE     ((chavrusas.luser_id)='3166' and chavrusas.ended=false)
  AND     (chavrusas.luser_type) <> (chavrusas.ruser_type)
  AND NOT ((chavrusas.luser_type)='teacher' AND (chavrusas.ruser_type)='student')
  AND NOT ((chavrusas.ruser_type)='teacher' AND (chavrusas.luser_type)='student')
ORDER BY 4;

Users - это запрос, который:

SELECT 
  tblusers.*,
  tblusershliach.*,
  tbluserstudent.*,
  tbluserstudentteacher.*,
  tbluserteacher.*
FROM
(
  (
    (tblusers 
     LEFT JOIN tblusershliach 
     ON tblusers.id = tblusershliach.shliach_user_id
    )
  LEFT JOIN tbluserstudent 
  ON tblusers.id = tbluserstudent.student_user_id
  )
LEFT JOIN tbluserstudentteacher
ON tblusers.id = tbluserstudentteacher.student_teacher_user_id
) 
LEFT JOIN tbluserteacher 
ON tblusers.id = tbluserteacher.teacher_user_id;

вместо использования «Users» в первом утверждении, я просто хочу объединить их в один оператор

как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 31 августа 2009

Если вы смотрите на объединение строк из обоих запросов (т.е. 3 строки из таблицы 1 и 2 строки из таблицы 2 = 5 строк с использованием окончательного запроса), вы можете написать

SELECT * FROM TABLE1
UNION
SELECT * FROM TABLE2

Для работы UNION количество полей в обоих запросах должно совпадать с типом данных.

т.е. если в TABLE1 есть поля numeric, numeric, text, date - TABLE2 также должен иметь такое же количество полей (4) и в том же порядке типа данных (т. е. numeric, numeric, text, date).

РЕДАКТИРОВАТЬ: Я посмотрел на ваш измененный вопрос. Это нормально, когда пользователь имеет отдельный запрос, а не делает его одним большим полностью нечитаемым запросом в MS-Access.

Access не сохраняет форматирование SQL при его сохранении. Поэтому имеет смысл разделить запрос на несколько частей, которые можно многократно использовать, чем помещать все в отдельный запрос.

В вашем примере, если вы хотите, чтобы пользователи были частью основного запроса - это нужно будет повторить для обоих случаев (ЛЕВАЯ и ПРАВАЯ сторона UNION). Это не имеет смысла.

РЕДАКТИРОВАТЬ: Вот большой запрос. Спасибо @Welbog. Форматирование будет потеряно при сохранении запроса в Access.

РЕДАКТИРОВАТЬ 2: посмотреть, помогает ли это. Я включил запрос "USERS" в ваш основной sql.
Идея состоит в том, чтобы соответствовать скобкам.

SELECT 
  users.id,
  users.first,
  users.last,
  chavrusas.luser_type AS user_type,
  chavrusas.id, 
  users.title, 
  users.city, 
  users.state, 
  users.home_phone, 
  users.email
FROM 
    (
        (
            (
                (tblusers AS Users
                 LEFT JOIN tblusershliach 
                 ON tblusers.id = tblusershliach.shliach_user_id
                )
                LEFT JOIN tbluserstudent 
                ON tblusers.id = tbluserstudent.student_user_id
            )
                LEFT JOIN tbluserstudentteacher
                ON tblusers.id = tbluserstudentteacher.student_teacher_user_id
        ) 
        LEFT JOIN tbluserteacher 
        ON tblusers.id = tbluserteacher.teacher_user_id;
    )
INNER JOIN chavrusas 
  ON Users.id=chavrusas.luser_id
WHERE     ((chavrusas.ruser_id)='3166' and chavrusas.ended=false) 
  AND     (chavrusas.luser_type) <> (chavrusas.ruser_type)
  AND NOT ((chavrusas.luser_type)='teacher' AND (chavrusas.ruser_type)='student')
  AND NOT ((chavrusas.ruser_type)='teacher' AND (chavrusas.luser_type)='student'); 
UNION
SELECT  
  users.id, 
  users.first, 
  users.last, 
  chavrusas.ruser_type AS user_type, 
  chavrusas.id, 
  users.title, 
  users.city, 
  users.state, 
  users.home_phone, 
  users.email
FROM
    (
        (
            (
                (tblusers AS Users
                 LEFT JOIN tblusershliach 
                 ON tblusers.id = tblusershliach.shliach_user_id
                )
                LEFT JOIN tbluserstudent 
                ON tblusers.id = tbluserstudent.student_user_id
            )
                LEFT JOIN tbluserstudentteacher
                ON tblusers.id = tbluserstudentteacher.student_teacher_user_id
        ) 
        LEFT JOIN tbluserteacher 
        ON tblusers.id = tbluserteacher.teacher_user_id;
    )
INNER JOIN chavrusas 
  ON Users.id=chavrusas.ruser_id
WHERE     ((chavrusas.luser_id)='3166' and chavrusas.ended=false)
  AND     (chavrusas.luser_type) <> (chavrusas.ruser_type)
  AND NOT ((chavrusas.luser_type)='teacher' AND (chavrusas.ruser_type)='student')
  AND NOT ((chavrusas.ruser_type)='teacher' AND (chavrusas.luser_type)='student')
ORDER BY 4;
1 голос
/ 01 сентября 2009

Ваш оператор SQL содержит точку с запятой перед ключевым словом UNION. Я не уверен, как Jet / ACE относится к этому, но я всегда думал, что точка с запятой означает «конец утверждения». Откажитесь от него и посмотрите, отличаются ли ваши результаты. Я совсем не уверен, что это решит вашу проблему, но давайте удостоверимся, что это не поможет.

Обновление : Я провел несколько тестов, и похоже, что Jet / ACE просто игнорирует точку с запятой в UNION. Я лаял не на то дерево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...