Запрос на объединение 1 таблицы с 2 перекрывающимися таблицами

У меня есть 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)
);

HW_SERVER1

APPID имя_машины LocationCd 1 м1 а1 1 м2 а2 2 м1 а1 2 м3 а3 3 м5 а2 ... ... ...

HW_SERVER2

APPID имя_машины LocationCd 1 м1 а1 2 м6 а6 2 м7 а2 2 м5 а2 3 м5 а2 5 м8 а5 6 м2 а2 ... ... ...

Каждое имя машины имеет уникальный LocationCd. Что мне нужно, так это набор результатов, который включает все отдельные LocationCd для всех APPID.

Набор результатов

APPID LocationCd 1 а1 1 а2 2 а1 2 а2 2 а3 2 а6 3 а2 5 а5 6 а2

Набор результатов, который включает MachineName, также полезен, мне просто нужно удалить повторяющиеся комбинации APPID/LocationCd.

Спасибо за любые отзывы или предложения!

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
72
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Если я правильно понимаю, вы просто хотите 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 устраняет необходимость в distinct.

Dale K 21.12.2020 05:22

Все быстро ухватились за простой ответ: использовать 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, мой голос за вас.

Это такой аккуратный способ отфильтровать дубликаты!

edtopia 21.12.2020 15:34

@etopia Нет проблем! Если у вас есть какие-либо вопросы, не стесняйтесь, и я сделаю все возможное, чтобы ответить на них.

J.D. 21.12.2020 15:49

Другие вопросы по теме