使用distinct的SQL Server查询的最佳方法

时间:2009-01-09 09:53:49

标签: sql sql-server tsql

我有两个表:TableA和TableB,由TableA.TableA_Id-> 1..n< -TableB.TableA_Id加入。一个简单的PK-FK。

我需要在TableB上提供具有特定条件的不同 TableA记录。这是我的第一种方法:

SELECT * FROM TableA A INNER JOIN TableB B ON A.idA = B.IdA AND B.Date ='2009-01-10'ODER BY A.Id;

这很好,但它并没有给我“不同”的记录。表B上的一些记录可能是重复的,因此我可以多次获得相同的记录。

所以我决定执行一个子选择(性能不是问题,因为子选择最终可能最终有20/30记录):

SELECT * FROM TableA WHERE TableA.Id IN(SELECT DISTINCT IdA FROM TableB WHERE Date ='20090110')ORDER BY TableA.IdA;

这很好用。

现在的问题是:我如何使用内连接并仍然获得不同的值?这可能在一次通过或嵌套查询是必须的吗?我错过了什么?

4 个答案:

答案 0 :(得分:2)

使用派生表

SELECT * FROM TableA 
JOIN
(SELECT DISTINCT IdA FROM TableB WHERE Date = '20090110') a
ON a.IDA = TAbleA.IDA
ORDER BY TableA.IdA

答案 1 :(得分:2)

我认为正常存在的陈述是你需要的:

SELECT * 
FROM TableA A 
WHERE Exists( select B.IdA from TableB B where A.IdA = B.IdA and B.Date = '2009-01-10' )
ORDER BY A.Id;

在性能方面,它应该是最好的方法。

如果您需要来自另一个表的值,并且为了避免使用distinct,您可以加入一个分组如下的子查询:

Select TableA.*, groupedTableB.OtherData 
From TableA
Inner join 
(
    select TableB.IdA, Sum(TableB.Data) SummaryData
    from TableB where TableB.Date = '2009-01-10'
    group by TableB.IdA

) groupedTableB on groupedTableB.IdA = TableA.IdA

答案 2 :(得分:1)

使用

的问题
SELECT DISTINCT * FROM TableA A INNER JOIN TableB B ON A.idA = B.IdA 
AND B.Date = '2009-01-10' ORDER BY A.Id;

如果它确实返回了重复的idA值,那是因为你选择了太多列,如果你不能减少你选择的内容,你需要子查询。

答案 3 :(得分:0)

这个怎么样:

如果你愿意的话,
select * from TableA a 
  where a.TableA_Id in
(select TableA_Id from TableB where [Date] = '2009-01-10')
order by a.TableA_Id

You could add distinct到子查询,我不确定这是否会改善或降低你的表现。