我想从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
答案 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;
答案 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;
答案 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