#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, но ваш вопрос предполагает, что вам нужны дубликаты.