There are cities, suppliers, and customers tables.
Each supplier
, (as well as customer
), is located in one and only one city.
CREATE TABLE Cities ( Id int IdENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Name nvarchar(100) NOT NULL UNIQUE, )
CREATE TABLE Suppliers ( Id int IdENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Name nvarchar(100) NOT NULL UNIQUE, CityId int NOT NULL, CONSTRAINT FK_Suppliers_Cities FOREIGN KEY (CityId) REFERENCES Cities (CityId) )
CREATE TABLE Customers ( Id int IdENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Name nvarchar(100) NOT NULL UNIQUE, CityId int NOT NULL, CONSTRAINT FK_Customers_Cities FOREIGN KEY (CityId) REFERENCES Cities (CityId)
How could I select pairs of supplier and customer within the city, where each of them is mentioned only once?
P.S. if there is no “pair” NULL
should be instead. E.g.:
cityId | supplierId | customerId |
---|---|---|
1 | 1 | 1 |
1 | 2 | 2 |
1 | 3 | NULL |
2 | 4 | 3 |
2 | NULL | 4 |
So… having suppliers with ids 1
, 2
are located in city 1
and customers with ids 1
, 2
are located there as well:
With JOIN
I receive “duplicated” pairs (e.g. 1-1, 1-2, 2-1, 2-2), here I ask how to make (1-1, 2-2) pairs.
Advertisement
Answer
You seem to want vertical lists of suppliers and customers. The problem is that you don’t have a join
key. You can create one with row_number()
:
select coalesce(s.cityid, c.cityid) as cityid, s.id as supplierid, c.id as customerid from (select s.*, row_number() over (order by id) as seqnum from suppliers s ) s full join (select c.*, row_number() over (order by id) as seqnum from customers c ) c on s.cityid = c.cityid and s.seqnum = c.seqnum order by cityid, coalesce(s.seqnum, c.seqnum)