2017-01-04 56 views
0

我需要找到所有使用Last作爲標準的地址,但是,如果有人住在同一個地址並且姓氏不同,我也需要返回。查找匹配的行在同一個MS SQL表中

我的桌子下面

ID  Last  Addr 
---- ---- ----- 
1  Smith 123 Fake St 
2  Smith 123 Fake St 
3  Fox  123 Fake St 
4  Jones 111 Jones Rd 

我嘗試這個查詢

SELECT * 
FROM Table 
WHERE Addr IN 
     (SELECT Addr 
      FROM Table AS T 
      GROUP BY Addr 
      HAVING COUNT(ID) > 1) 
     AND Last = 'Smith' 

這將返回ID爲1和2,但我還需要它返回ID 3,因爲地址是相同的

簡體版。我知道它沒有返回,因爲Last在我的WHERE語句中不匹配,但是,當我搜索並且需要知道其他人在同一個地址時,不管他們的名字如何,我都只有Last。

+0

'AND Last ='Smith''在你的子查詢之外;將其移入子查詢的括號內;即在第二個「FROM TABLE」語句和「GROUP BY」子句 – JohnLBevan

+0

之間移動它在子查詢中實際返回的結果更少;我不是專家,所以IDK爲什麼但沒有成功。不管怎麼說,還是要謝謝你。 – user2625842

回答

1

您可以使用COUNT(*) OVER()

WITH CTE AS 
(
    SELECT *, 
      N = COUNT(*) OVER(PARTITION BY Addr) 
    FROM dbo.YourTable 
) 
SELECT * 
FROM CTE A 
WHERE N > 1 
AND EXISTS(SELECT 1 FROM dbo.YourTable 
      WHERE Last = 'Smith' 
      AND Addr = A.Addr); 
+0

這個完美的作品!謝謝Lamak! – user2625842

0

你可以做的,什麼計數和組超過1是重複

select ID, Last, Addr, count(1) num from table group by ID, Last, Addr 
0

請嘗試以下方法:

SELECT * 
FROM Table AS t 
WHERE EXISTS (SELECT 1 
       FROM Table 
       WHERE Addr = t.Addr AND Last = 'Smith'); 

下面是一個運行示例:

declare @Table table (ID int, [Last] nvarchar(50), Addr nvarchar(50)); 

insert into @Table values 
(1, 'Smith', '123 Fake St'), 
(2, 'Smith', '123 Fake St'), 
(3, 'Fox', '123 Fake St'), 
(4, 'Jones', '111 Jones Rd'); 

SELECT * 
FROM @Table AS t 
WHERE EXISTS (SELECT 1 
       FROM @Table 
       WHERE Addr = t.Addr AND Last = 'Smith'); 

/* Result 
ID Last  Addr 
-- -------- ----------------------- 
1 Smith 123 Fake St 
2 Smith 123 Fake St 
3 Fox  123 Fake St 
*/ 
+0

這將返回一個空集。 – user2625842

+0

它的工作原理..我添加了一個運行示例。 – wdosanjos

+0

我很抱歉,我可能輸錯了查詢,但是,這是返回額外的行。我得到了所有史密斯包括那些沒有重複地址的史密斯。重讀我的問題後,我認爲我沒有說清楚。我會接受拉瑪克的答案,因爲它給了我我需要的東西,但是,這也是好的。 – user2625842

相關問題