对不好的头衔抱歉,我无法想出更好的......
我只需要一些帮助来制定一个SQL语句。不幸的是我的SQL有点生疏。我附上了一个简化的情况示例(ER模型)。
正如你在那里看到的,我有4张桌子。客户,产品,许可证和支持。 始终为特定产品颁发许可证并将其分配给特定客户。客户可以持有一个或多个许可证。 最初我只想要表Customer,Prodcut和Licenses的组合信息。到目前为止这么好,这很容易,我只需要求
SELECT *
FROM Customers,
Product,
Licenses
WHERE Customers.CustomerID = Licenses.CustomerID
AND Product.ProductID = Licenses.ProductID
但现在我还需要从Support表中添加一些数据。我想要上一个声明中的每个条目(对于每个许可证)现在还要描述和最后支持案例(如果有的话)的日期,这些案例与相应的LicenseKey相关联(仅限最后一个) LicenseKey不是全部)。 SupportID是一个运行号码,因此可以按此排序。
我知道我也可以询问所有案例,并在我的申请中过滤收到的日期,但不幸的是网络流量应该保持在最低限度。
帮助我Obi-Wan Kenobi ..你是我唯一的希望......
答案 0 :(得分:1)
如果没有许可证支持案例,请执行LEFT JOIN
。
NOT EXISTS
只返回一个支持案例,只有相同的许可证才有效。
SELECT *
FROM Customers c
JOIN Licenses l ON c.CustomerID = l.CustomerID
JOIN Product p ON p.ProductID = l.ProductID
LEFT JOIN Support s1 ON s1.LicenseKey = l.LicenseKey
WHERE NOT EXISTS (select 1 from Support s2
where s2.LicenseKey = s1.LicenseKey
and s2.Date > s1.Date)
注意:现在使用现代显式JOIN
语法。如果需要,更容易编写(没有错误),更容易阅读,更容易转换为外部联接。