2013-05-19 7 views
0

Добрый день.Как объединить два запроса sql?

У меня есть два SQL-запрос:

Первая:

SELECT name FROM 
TableOne 
WHERE city='3452' AND firm='49581' AND service='2' 
Group by name 

Второе:

SELECT name FROM 
TableTwo 
WHERE city='3452' AND firm='49581' AND service='2' 
Group by name 

Скажите, пожалуйста, как совместить эти два запроса SQL и выбрать все имя (с группой по имени) из двух таблиц?

ответ

1

Вы можете использовать UNION ALLhttp://sqltutorials.blogspot.com/2007/06/sql-union-all.html

SELECT name 
FROM (
    SELECT name 
    FROM TableOne 
    WHERE city='3452' AND firm='49581' AND service='2' 
    UNION ALL 
    SELECT name 
    FROM TableTwo 
    WHERE city='3452' AND firm='49581' AND service='2') x 
GROUP BY name 
+0

См. Ответ Бранко для более точного решения, если вы фильтруете одни и те же столбцы и значения для каждого из подзапросов. Производительность между двумя решениями должна быть одинаковой. –

1

Просто используйте UNION оператор между двумя запросами. Согласно ответа в this similar question:

Вы можете смотреть на использовании UNION в запросе:

Select * from a UNION Select * from b Note: 

лучше практика квалифицировать ваши имена столбцов вместо использования * Справка. Это будет , также сделайте запрос еще полезным, если ваши две таблицы подверглись изменениям схемы , но вы все же хотели отбросить все данные, которые имели две таблицы .

Union исключает такие же объекты. Чтобы этого избежать, вместо этого вы можете использовать UNION ALL.

1

Ну, «объединить» может означать много вещей, но я предполагаю, что вы хотите что-то вроде этого:

SELECT name 
FROM (
    SELECT name, city, firm, service FROM TableOne 
    UNION ALL 
    SELECT name, city, firm, service FROM TableTwo 
) Q 
WHERE city='3452' AND firm='49581' AND service='2' 
GROUP BY name 

Там нет необходимости использовать UNION (без ALL), так как GROUP BY будет удалите дубликаты в любом случае.

BTW, все эти поля, используемые в предложении WHERE, действительно строки? Если нет, вы хотите удалить одиночные кавычки, если это необходимо. Немного подозрительно, что вы используете строковые литералы, содержащие только числа.

+0

Вам нужно будет выбрать 'city',' firm' и 'service' в ваших подзапросах. –

+0

@steaks Спасибо. Исправленный. –

0

Я считаю, что этот синтаксис немного проще и, следовательно, легче поддерживать. Запятая в строке 2 соединяется.

SELECT name FROM 
TableOne, TableTwo 
WHERE city='3452' AND firm='49581' AND service='2' 
Group by name 
+0

Я мог ошибаться, но я не думаю, что это работает в SQL Server 2008. Не получите ошибку «Незначительное имя столбца»? – Greg

+0

@Greg. Ошибка двусмысленного столбца будет происходить, поскольку имена двух столбцов, используемых в соединении, идентичны. Согласно [link] http: // stackoverflow.com/questions/3918570/what-is-the-difference-between-using-a-cross-join-and-put-a-comma-between-the-two-tables). CROSS JOIN стал стандартом ANSI в SQL: 1992 , а также синтаксис ANSI SQL: 1989 с использованием запятых. – Marichyasana

+0

запрос имеет ошибку .. –

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