2014-12-17 7 views
0

ситуационныхAccess SQL - Одинаковые записи из двух запросов

У меня есть два запроса, которые выбирают информацию из различных связанных таблиц. Один выбирает все записи для year = 2012 и другой для year = 2013

SELECT c.Company_ID, c.Company_Name, e.Employee_ID, e.Employee_Name, p.Position 
FROM ((tbl_Company AS c 
INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
WHERE (((r.Report_Year)=2012)) 

и

SELECT c.Company_ID, c.Company_Name, e.Employee_ID, e.Employee_Name, p.Position 
FROM ((tbl_Company AS c 
INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
WHERE (((r.Report_Year)=2013)) 

Вопрос

Как построить запрос, чтобы вернуть Company_ID, Company_Name, Employee_ID, Employee_Name , и Position, которые совпадают в обоих запросах (т. е. что существует в 2012 и 2013 годах)?


Update

Использование подзапрос я могу выбрать company_id с 2012 года, только если он в 2013 году Как я теперь убедитесь, что он только выбирает также employee_id и position, если они также то же самое в 2013 году, как и в 2012 году?

SELECT c.Company_ID, c.Company_Name, e.Employee_ID, e.Employee_Name, p.Position 
FROM ((tbl_Company AS c 
INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
WHERE r.Report_Year=2013 
AND 
c.Company_ID IN 
(
    SELECT c.Company_ID 
    FROM ((tbl_Company AS c 
    INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
    INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
    INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
    WHERE r.Report_Year=2012 
) 

ответ

0

Это неуклюжее, может быть более элегантным способом, но я думаю, что это выполняет то, что вы хотите:

SELECT DISTINCT * FROM 
(SELECT c.Company_ID, c.Company_Name, e.Employee_ID, e.Employee_Name, p.Position_ID, p.Position 
FROM ((tbl_Company AS c 
INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
WHERE (((r.Report_Year)=2012)) 
) 
t1 INNER JOIN 

(SELECT c.Company_ID, c.Company_Name, e.Employee_ID, e.Employee_Name, p.Position_ID, p.Position 
FROM ((tbl_Company AS c 
INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
WHERE (((r.Report_Year)=2013)) 
) 

t2 ON t1.Company_ID = t2.Company_ID 
AND 
t1.Employee_ID = t2.Employee_ID 
AND t1.Position_ID = t2.Position_ID 
+0

Нужно лишь небольшое изменение, но оно отвечает на мой вопрос. Благодарю. – tospig

0

Если оба ваших запросов возвращают те же столбцы, вы можете использовать UNION ALL условие для слияния результатов двух запросов.

SELECT c.Company_ID, c.Company_Name, e.Employee_ID, e.Employee_Name, p.Position_ID, p.Position 
FROM ((tbl_Company AS c 
INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
WHERE (((r.Report_Year)=2012)) 
UNION ALL 
SELECT c.Company_ID, c.Company_Name, e.Employee_ID, e.Employee_Name, p.Position_ID, p.Position 
FROM ((tbl_Company AS c 
INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
WHERE (((r.Report_Year)=2013)) 

http://msdn.microsoft.com/en-us/library/bb208962%28v=office.12%29.aspx

Но вы также можете использовать пункт IN, чтобы сделать его проще и короче:

SELECT c.Company_ID, c.Company_Name, e.Employee_ID, e.Employee_Name, p.Position_ID, p.Position 
FROM ((tbl_Company AS c 
INNER JOIN tbl_Employee AS e ON c.Company_ID = e.Company_ID) 
INNER JOIN tbl_Position AS p ON e.Employee_ID = p.Employee_ID) 
INNER JOIN tbl_Report AS r ON (r.Report_ID = p.Report_ID) AND (c.Company_ID = r.Company_ID) 
WHERE (((r.Report_Year) IN (2012, 2013))) 
+0

Я думаю, что это дает мне все информацию из обоих лет (и, следовательно, где информация существует в оба года, она повторяется), тогда как я получаю информацию, которая существует только в 1-м и 2-м году. – tospig

+0

Если вам нужны уникальные строки из обоих лет, используйте первый подход с UNION ALL и удалите ключ ALL.UNION, без ALL, вернет различные значения из двух наборов данных. – Oscar

+0

@tospig Кроме того, у Access, похоже, есть ключевое слово DISTINCTROW, нестандартное sql, которое может соответствовать вашим потребностям: http://msdn.microsoft.com/en-us/library/bb177882(v=office.12). aspx – Oscar

0

Там это пересекаются, который похож на союз: http://www.sqlguides.com/sql_intersect.php

SQL INTERSECT - это запрос, который позволяет вам выбрать соответствующую информацию. из 2 таблиц, это комбинация 2 инструкции SELECT в 1 и отображение .

INTERSECT производит строки, которые появляются в обоих запросах. Это означает, что команда действует как оператор И (значение выбирается только в том случае, если отображается в обоих операциях).

Вы можете облегчить людям опробовать ваш SQL, если вы используете SQL Fiddle. Установка Я очень простая таблица, чтобы показать пример здесь: http://sqlfiddle.com/#!6/baf67/3

+1

Я не думал, что существует «пересечение» в MS Access? – tospig

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