Объединение результатов двух операторов select

#sql #sql-server #inner-join

#sql #sql-сервер #внутреннее соединение

Вопрос:

У меня есть следующая схема, и я просто застрял на одной конкретной части.

 CREATE TABLE Suppliers (ID INT, Name VARCHAR(128), Postcode VARCHAR(10));

CREATE TABLE Branches (ID INT, Name VARCHAR(128), Postcode VARCHAR(10));

CREATE TABLE Postcode_States (ID INT, State VARCHAR(128), Postcode VARCHAR(10));


SELECT S.Name AS SupplierName, PS.State AS SupplierState
FROM Suppliers AS S 
LEFT JOIN Postcode_States PS ON S.Postcode = PS.Postcode;

SELECT B.Name AS BranchName, PS.State AS BranchCounty
FROM Branches AS B 
LEFT JOIN Postcode_States PS ON B.Postcode = PS.Postcode;
 

У меня есть три таблицы: поставщики, филиалы и Postcode_States. Я выбрал всех поставщиков и их состояния, объединенные по почтовому индексу в одном запросе, и все филиалы и их состояния, объединенные по почтовому индексу в другом запросе. Может кто-нибудь дать мне какие-либо рекомендации о том, как я мог бы объединить эти два запроса, чтобы я мог вернуть всех поставщиков и филиалы с одинаковым состоянием? Спасибо

Образец данных и запрошенный вывод запроса

введите описание изображения здесь

Комментарии:

1. пример данных ожидаемый результат будет полезен здесь

2. В том же состоянии, что и что? На данный момент вы возвращаете всех поставщиков.

3. Я хочу вернуть строки, содержащие имена поставщиков и названия филиалов, где состояние одинаковое

4. @user1501171 . . . Что такое Техас в том же штате?

Ответ №1:

Вы можете присоединиться:

 select s.name, b.name, p.state
from suppliers s
inner join branches  b on b.postcode = s.postcode
inner join postcodes p on p.postcode = s.postcode
 

Ответ №2:

Если вам нужны состояния с более чем одним поставщиком, вы можете использовать оконные функции:

 select s.*
from (select s.name, b.name, p.state,
             count(*) over (partition by state) as cnt
      from suppliers s join
           branches b
           on b.postcode = s.postcode join
           postcodes p
           on p.postcode = s.postcode
     ) s
where cnt >= 2
order by cnt desc, state;
 

Это не возвращает Texas, но ваш вопрос предполагает, что вам нужны дубликаты.