У меня есть 2 таблицы с одинаковыми столбцами. У них есть записи одинаковые и записи разные.
CREATE TABLE APP (
APPID int NOT NULL,
APPName varchar(255) NOT NULL,
);
CREATE TABLE HW_SERVER1 (
APPID int NOT NULL,
MachineName varchar(255) NOT NULL,
LocationCd varchar(255),
CONSTRAINT PK_HW PRIMARY KEY (APPID, MachineName)
);
CREATE TABLE HW_SERVER2 (
APPID int NOT NULL,
MachineName varchar(255) NOT NULL,
LocationCd varchar(255),
CONSTRAINT PK_HW PRIMARY KEY (APPID, MachineName)
);
Каждое имя машины имеет уникальный LocationCd. Что мне нужно, так это набор результатов, который включает все отдельные LocationCd для всех APPID.
Набор результатов, который включает MachineName, также полезен, мне просто нужно удалить повторяющиеся комбинации APPID/LocationCd.
Спасибо за любые отзывы или предложения!
Если я правильно понимаю, вы просто хотите union (а не union all, потому что хотите удалить дубликаты):
select APPID, LocationCd
from hw_server1
union -- on purpose to remove duplicates
select APPID, LocationCd
from hw_server2;
Вы можете использовать union
select appid, locationcd from HW_SERVER1
union
select appid, locationcd from HW_SERVER2
Запрос на объединение кажется здесь наиболее простым подходом:
SELECT a.APPID, hw.LocationCd
FROM APP a INNER JOIN HW_SERVER1 hw ON hw.APPID = a.APPID
UNION
SELECT a.APPID, hw.LocationCd
FROM APP a INNER JOIN HW_SERVER2 hw ON hw.APPID = a.APPID;
Примечание. Я выполняю объединение, описанное выше, чтобы убедиться, что мы сообщаем только о приложениях, которые отображаются в таблице APP.
Вы можете присоединиться к 2 столам и взять отдельный набор.
SELECT DISTINCT APPID, LocationCd
FROM
(
SELECT APPID, LocationCd
FROM HW_SERVER1
UNION ALL
SELECT APPID, LocationCd
FROM HW_SERVER2
)
Все быстро ухватились за простой ответ: использовать UNION для удаления дубликатов (в отличие от UNION ALL), но пропустили ваше упоминание о том, что наличие столбца MachineName также было бы полезно для вас. Пожалуйста, посмотрите этот ответ, который дает вам отличный набор результатов со всеми 3 столбцами:
WITH CTE_UniqueLocationCd AS
(
SELECT APPID, LocationCd
FROM HW_SERVER1
UNION -- Removes dupes
SELECT APPID, LocationCd
FROM HW_SERVER2
),
CTE_UniqueMachineName AS
(
SELECT APPID, MachineName
FROM HW_SERVER1
UNION -- Removes dupes
SELECT APPID, MachineName
FROM HW_SERVER2
)
SELECT DISTINCT -- Final removal of dupes that result from the many-to-many join on APPID
ULC.APPID, UMN.MachineName, ULC.LocationCd
FROM CTE_UniqueLocationCd AS ULC
INNER JOIN CTE_UniqueMachineName AS UMN
ON ULC.APPID = UMN.APPID
Хороший вопрос, чтобы узнать разницу между UNION ALL и UNION, мой голос за вас.
Это такой аккуратный способ отфильтровать дубликаты!
@etopia Нет проблем! Если у вас есть какие-либо вопросы, не стесняйтесь, и я сделаю все возможное, чтобы ответить на них.
Конечно, использование прямого union устраняет необходимость в distinct.