SQL Server - 根据字符串值从一个表中选择数据

时间:2014-04-11 09:33:17

标签: sql sql-server sql-server-2008

我想根据存储在另一个表中的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个结果。

非常感谢任何指导建议。

提前致谢。

3 个答案:

答案 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

非常感谢你的帮助。