2015-07-12 73 views
0

SchemaSQL查询 - 试图找出外部联接三个用表

嗨there..above是我的数据库架构,让我的价格分配给特定的位置。我想要轻松地弄清楚的是,当我添加一个新包时,我的“packagelocationprices”表将缺少条目。我如何获得没有为所有地点和特定地点分配位置价格的所有包裹。

我有这个所以far..but它没有覆盖没有什么在it..how我可以调整这个查询采取的位置考虑其他地点..

SELECT * 
FROM Package p 
LEFT OUTER JOIN PackageLocationPrices pr ON p.Id = pr.PackageId 
Where pr.MonthlyPrice IS NULL 
OR pr.TotalPrice IS NULL 

谢谢

+0

这也将有助于编辑您的问题,并提供样本数据和所需的结果。对你想要做的事情可能有不止一个合理的解释。 (一个问题有1个被删除的答案是不寻常的,少得多4.) –

回答

0

您可以在没有价格的情况下获得套餐/地点对。这是一个两步过程。生成所有包/位置对,然后删除确实有价格的包。

第一部分是cross join。第二个是left joinwhere(或类似结构):

select p.*, l.* 
from package p cross join 
    location l left join 
    packagelocationprices plp 
    on plp.packageid = p.pid and plp.locationid = l.id 
where plp.packageid is null; 
0

首先你得到所有的包和位置的可能的组合(交叉连接)。将它保存在公用表表达式中,以便您可以随时重用。尽管在这个例子中这不是完全必要的,但它给了你更多的灵活性。

然后,您将对表PackageLocationPrices执行LEFT JOIN,该表是用于关联包,位置和设置价格的表。然后选择在该表上没有一行的记录。

;WITH cte AS 
(
    SELECT p.Id AS PackageId, l.Id AS LocationId 
    FROM Package p 
    CROSS JOIN Location l 
) 
select cte.PackageId, cte.LocationId 
FROM cte 
LEFT JOIN PackageLocationPrices plp ON cte.PackageId=plp.PackageId AND plp.LocationId=cte.LocationId 
WHERE plp.Id IS NULL