2010-08-11 4 views
1

У меня есть база данных SQL Server 2008 с двумя таблицами. Этими таблицами являются Адрес и Магазин. Эти таблицы определяются какПоиск похожих записей с SQL

Address 
-------- 
ID (int) 
Line1 (nvarchar(255)) 
PostalCode (nvarchar(5)) 
City (nvarchar(255)) 
State (nvarchar(255)) 

Store 
----- 
ID (int) 
LocationID (int) 
Name 

Я пытаюсь найти список магазинов, которые расположены по одному адресу с помощью Line1 и PostalCode. Мне нужно игнорировать идентификатор из-за дубликатов записей. Меня не интересуют магазины, которые являются единственным магазином в их местоположении. Скорее, мне нужен только список магазинов, в которых есть место. К сожалению, я не уверен, как это сделать.

Как написать запрос, который будет возвращать только записи, которые являются групповыми для адресов в тех же Line1 и PostalCode?

Спасибо!

ответ

2
select s.ID, s.LocationID, s.Name, a.ID, a.Line1, a.PostalCode 
from (
    select Line1 + ', ' + PostalCode as Line1PostalCode 
    from Address a 
    inner join Store s on a.ID = s.LocationID 
    group by Line1+ ', ' + PostalCode 
    having count(*) > 1 
) ag 
inner join Address a on ag.Line1PostalCode = a.Line1+ ', ' + a.PostalCode 
inner join Store s on a.ID = s.LocationID 
+0

HAVING! Я всегда забываю о функции HAVING. Спасибо. – user336786

3

Это то, что вы хотите?

SELECT t1.*, s.* FROM 
(SELECT Line1 ,PostalCode 
FROM Address 
GROUP BY Line1 ,PostalCode 
HAVING COUNT(*) >1) t2 
JOIN Address t1 ON t2.Line1 = t2.Line1 
AND t1.PostalCode = t2.PostalCode 
JOIN Store s on t1.ID = s.LocationID 
0

Этот запрос использует подзапрос, чтобы найти все адреса с более чем одного магазина, а затем использует его в качестве основы для выбора магазинов, чтобы показать.

WITH StoreAddress AS 
(
SELECT * FROM Store s INNER JOIN Address a ON s.LocationID=a.LocationID 
) 
SELECT sa.* FROM StoreAddress sa INNER JOIN 
    (SELECT Line1, PostCode FROM StoreAddress 
    GROUP BY Line1, PostCode 
    HAVING Count(ID)>1) pairs 
ON pairs.Line1=sa.Line1 AND pairs.PostCode=sa.PostCode 
ORDER BY sa.Line1, sa.PostCode 

Запрос сортируется по Line1 и PostCode, так что хранилища в том же месте отображаются вместе.

Смежные вопросы