我有两个表: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;
这很好用。
现在的问题是:我如何使用内连接并仍然获得不同的值?这可能在一次通过或嵌套查询是必须的吗?我错过了什么?
答案 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
到子查询,我不确定这是否会改善或降低你的表现。