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

SQL Server-基于字符串值从一个表中选择数据,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想根据存储在另一个表中的varchar从我的一个数据库表中查找数据 我们有一个制造商表M和一个参数表p,而不是每个制造商都有一个参数,因为60%的制造商之间存在大量交叉,我们认为在需要时,每个制造商都有参数会更干净,而对于其他制造商,只需有一组默认参数 这意味着我无法在两个表中存储ManufacturerID并创建简单链接,而是需要使用ManufacturerName进行链接 因此,我需要知道是否可以通过ManufacturerName链接,以及在参数表p中没有匹配项的位置查找Manufact

我想根据存储在另一个表中的varchar从我的一个数据库表中查找数据

我们有一个制造商表M和一个参数表p,而不是每个制造商都有一个参数,因为60%的制造商之间存在大量交叉,我们认为在需要时,每个制造商都有参数会更干净,而对于其他制造商,只需有一组默认参数

这意味着我无法在两个表中存储ManufacturerID并创建简单链接,而是需要使用ManufacturerName进行链接

因此,我需要知道是否可以通过ManufacturerName链接,以及在参数表p中没有匹配项的位置查找Manufacturer“Default”

作为链接的一部分,我们还包括:

p.CategoryID=M.CategoryID和p.PriceFrom=M.BasePrice

以下是数据结构:

制造商M:

制造商ID、制造商名称、类别ID、基准价格

参数p

类别ID、制造商名称、价格来源、价格目标、百分比

以下是一些示例数据:

制造商M:

参数p:

所以我们仍然需要在每个链接中返回1个结果

非常感谢任何指导意见


提前感谢。

根据您发布的条件,左侧加入应达到以下目的:

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)

如果我遗漏了一些内容,请在此处发布您的表格结构:

没有可使用的表格结构是困难的,但在

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
你可以得到你需要的。第一部分获取链接部分,第二部分仅获取尚未匹配的参数名称的默认值


这是一个包含少量数据的查询,查询结果是,这是我过度思考问题的另一种情况。 通过将以下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

非常感谢您的帮助。

嗨。我看不出您是如何绕过ManufacturerName匹配问题的,或者选择“Default”是我的表结构和建议的数据是否正确,否则请使用您的更新。。我会根据这个更新我的答案!!你好请看更新的问题,希望这有点帮助
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
(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