SQL - 如何从一个表中获取具有连接的重复记录在另一个表上

时间:2018-04-13 02:19:07

标签: sql sql-server sql-server-2012

我想从Table1获取记录,其中有相同访问号码的多条记录,但同时此访问号码也应该出现在表2中。

实施例

表1

    Access Number

 - 1000
 - 1000
 - 1000
 - 2000
 - 3000
 - 4000
 - 5000
 - 5000

表2

AccessNumber  Value

 - 1000       -Value1000
 - 1000       -Value9999
 - 2000       -Value2000
 - 3000       -Value3000
  

查询结果应为1000 - Value1000

这是我到目前为止所做的,请建议

SELECT a.AccessNumber, b.Valuefrom Table1 a
JOIN Table2 b on b.AccessNumber = a.AccessNumber
Group by a.AccessNumber, b.VAlue
HAVING COUNT(1) > 1;

我面临的问题是查询返回表2中的重复项。

1000   - Value1000
1000   - Value9999

5 个答案:

答案 0 :(得分:1)

我们可以使用SQL Server的EXCEPT运算符来实现这一点。但是,一个合理的方法是通过访问号码聚合两个表,然后将第一个连接到第二个,只保留出现在表中的访问号码在第一个比第二个。

SELECT t1.AccessNumber
FROM
(
    SELECT AccessNumber, COUNT(*) AS cnt_1
    FROM Table1
    GROUP BY AccessNumber
) t1
LEFT JOIN
(
    SELECT AccessNumber, COUNT(*) AS cnt_2
    FROM Table2
    GROUP BY AccessNumber
) t2
    ON t1.AccessNumber = t2.AccessNumber
WHERE
    t1.cnt_1 - COALESCE(t2.cnt_2, 0) > 0 AND t2.cnt_2 IS NOT NULL;

enter image description here

Demo

答案 1 :(得分:1)

如果没有关于为什么1000 - Value1000应该是结果而不是1000 - Value9999的大量信息,我们可以从顶部获取第一条记录:

select top 1 * from (

-- your original query
SELECT a.AccessNumber, b.Value from Table1 a
JOIN Table2 b on b.AccessNumber = a.AccessNumber
Group by a.AccessNumber, b.Value
HAVING COUNT(1) > 1
-- your original query

) as x;

如果我们只是在寻找具有重复记录的AccessNumber,您可以从所选列中删除b.Value,并在Group By子句中删除它。

SELECT a.AccessNumber from Table1 a
JOIN Table2 b on b.AccessNumber = a.AccessNumber
Group by a.AccessNumber
HAVING COUNT(1) > 1;

http://www.sqlfiddle.com/#!18/3f114/3

答案 2 :(得分:0)

- 希望此查询能为您提供帮助

wp

答案 3 :(得分:0)

您可以尝试使用嵌套作为AccessNumber行的标准> 1并交叉申请仅显示1条记录的标准

DECLARE @tblA AS TABLE
(
  AccessNumber INT
)
DECLARE @tblB AS TABLE
(
  AccessNumber INT,
  colB NVARCHAR(50)
)
INSERT INTO @tblA SELECT 1000
INSERT INTO @tblA SELECT 1000
INSERT INTO @tblA SELECT 1000
INSERT INTO @tblA SELECT 1000
INSERT INTO @tblA SELECT 2000
INSERT INTO @tblA SELECT 3000
INSERT INTO @tblA SELECT 4000
INSERT INTO @tblB SELECT 1000,'hello'
INSERT INTO @tblB SELECT 1000,'hello2'
INSERT INTO @tblB SELECT 2000,'world'

-- Query --
    SELECT tblB.* FROM (
    SELECT AccessNumber,COUNT(1) AS cnt FROM @tblA GROUP BY AccessNumber ) ftblA 
    CROSS APPLY (SELECT TOP(1) * FROM @tblB itblB WHERE ftblA.AccessNumber = itblB.AccessNumber) tblB
    WHERE ftblA.cnt >1
-- Only 1000 should be displayed only --

答案 4 :(得分:0)

使用subquery方法{/ 1}}

correlation

但是,您需要在select access_no, (select top 1 Value from table2 where access_no = t.access_no) as value from Table1 t where exists ( select 1 from table2 where access_no = t.access_no) group by access_no having count(*) > 1 中指定order by子句才能从subquery

中获取值