2009-12-01 31 views
1

我有一个SQL数据库SQL加入无需多次LEFT

车辆, RepairCharges, TowCharges在下表中,

总会有只有1用于车用其它表的记录,但多条记录。但是,如果在连接的表中有多个条目,那么我的当前LEFT OUTER Join正常工作,那么它返回的行数很多。

我的问题是,我需要创建一个SQL视图,将JOIN这些表,但是只返回车辆表的单个记录,即使连接表中有多个记录。这是可能的一个视图,还是我必须使用不同的方法?

编辑:从答案中,我意识到,因为我原本以为,这是不可能的设计。鉴于同样的情况,你会如何处理这个问题?

最终结果是每张车辆都有一张表,显示1行,并在同一行显示第一次拖曳和维修费用,如果有更多的拖曳或维修费用,则为每个车辆显示一条新行,而不会复制车辆信息。

+3

您需要定义你还想要什么。例如,如果有多个牵引费用,你想要返回什么?你想要最新的吗? – 2009-12-01 20:05:20

+0

在这种情况下,您希望返回Repair或Tow中的多个记录中的哪一个? – SqlRyan 2009-12-01 20:05:34

+0

需要样品数据+样品输出。我不明白这个问题。 – Jrud 2009-12-01 20:08:50

回答

6

,除非您使用AGGREGATE函数,否则从1到MANY的连接将按设计返回1返回MANY。

你有具体的,如只返回滞后,或最昂贵的。

显示您的查询,并指定您需要的许多。

2

除了汇总之外,您可以尝试在查询中添加DISTINCT子句。

4

JOIN的结果将始终包含左边的记录数乘以右边的记录数。这是JOIN定义的一部分,如果将​​其设置为视图或保留临时SQL,则不会更改任何内容。

你需要做的是改变什么加入,所以它只有一行。您需要表示一个条件,从许多可能的候选人中选择哪些的RepairCharges和TowCharges中的可能行感兴趣。上次约会?最高收费?最接近满月阶段?那么你加入的只有一排。

例子:

SELECT * FROM Vechicles 
CROSS APPLY (
SELECT TOP (1) * 
FROM RepairCharges 
WHERE VechicleID = Vechicles.VechicleID 
ORDER BY RepairDate DESC) AS LastRepair;