我想根据存储在另一个表中的varchar从我的一个数据库表中查找数据。
我们有一个Manufacturers (M)
表和一个Parameters (P),
表,而不是每个制造商都有一个参数(因为60%之间有很多交叉),我们认为它在需要时为每个制造商提供参数会更清晰,而对于其他参数则只有一组默认参数。
这意味着我无法在两个表中存储ManufacturerID
并创建一个简单的链接,而是需要使用ManufacturerName
进行链接。
因此,我需要知道是否可以通过ManufacturerName
进行关联,并且在Parameters
表(P)中找不到匹配的制造商'默认'。
作为链接的一部分,我们还包括:
P.CategoryID = M.CategoryID AND(P.PriceFrom< = M.BasePrice AND P.PriceTo> = M.BasePrice)
以下是数据结构:
制造商(M):
ManufacturerID,ManufacturerName,CategoryID,BasePrice
参数(P)
CategoryID,ManufacturerName,PriceFrom,PriceTo,Percentage
以下是一些示例数据:
制造商(M):
ManufacturerID | ManufacturerName | CategoryID | BasePrice
3 | Apple | 1 | 150.00
3 | Apple | 9 | 99.99
10 | HTC | 1 | 50.00
15 | Nokia | 1 | 25.00
19 | Samsung | 1 | 80.00
参数(P):
CategoryID | ManufacturerName | PriceFrom | PriceTo | Percentage |
1 | Samsung | 0.00 | 99.99 | 50% |
1 | Apple | 0.00 | 99.99 | 55% |
1 | Apple | 100.00 | 149.99 | 45% |
9 | Apple | 0.00 | 99.99 | 65% |
1 | Default | 0.00 | 99.99 | 60% |
所以我们仍需要在每个链接中返回1个结果。
非常感谢任何指导建议。
提前致谢。
答案 0 :(得分:1)
根据您发布的条件,Left Join
应符合以下目的:
select M.ManufacturerID, P.ManufacturerName, M.CategoryID
from Manufacturers M
left join Parameters P On P.CategoryID = M.CategoryID AND (P.PriceFrom <= M.BasePrice AND P.PriceTo >= M.BasePrice)
如果我遗漏了某些内容,请在此处发布您的表格结构:SQL Fiddle
答案 1 :(得分:0)
没有可以使用的表结构是difficoult但是在
行内SELECT m.name Manufacturer, p.name, p.value, p.Manufacturer alias
FROM Manufacturers m
INNER JOIN Parameter p ON (m.name = p.Manufacturer)
UNION ALL
SELECT m.name Manufacturer, p.name, p.value, p.Manufacturer alias
FROM Manufacturers m
LEFT JOIN Parameter p on p.Manufacturer = 'default'
WHERE m.name + p.name not in (SELECT m.name + p.name
FROM Manufacturers m
INNER JOIN Parameter p
ON (m.name = p.Manufacturer)
)
ORDER BY 1, 2
可以得到你需要的东西。第一部分为您提供链接部分,第二部分仅为没有匹配的参数名称获取默认值。
这是SQLFiddle,其中包含一些数据和查询
答案 2 :(得分:0)
好的,事实证明这是另一种我在思考问题的情况。 我设法通过将以下Select语句嵌套在另一个select中来实现此功能:
(SELECT
TOP(1) Percentage
FROM
Parameters AS P
WHERE
P.CategoryID = R.CategoryID
AND (P.PriceFrom <= M.BasePrice AND P.PriceTo >= M.BasePrice)
AND (P.ManufacturerName = M.ManufacturerName OR P.ManufacturerName = 'Default')
ORDER BY
CASE WHEN P.ManufacturerName = 'Default' THEN 'ZZZZZ' ELSE P.ManufacturerName END
) AS Markup
非常感谢你的帮助。