【问题标题】:SQL querying/searching records from inner join's columnsSQL 从内部连接的列中查询/搜索记录
【发布时间】:2014-02-09 10:14:41
【问题描述】:

查询:

   SELECT 
        (STUFF((SELECT ',' + CONVERT(VARCHAR(50),mode.model_name)  
        FROM InventoryMake SUB INNER JOIN Model mode ON SUB.model_ID = mode.model_ID 
        WHERE SUB.inv_ID = CAT.inv_ID FOR XML PATH('')), 1, 1, '' )) [Models],CAT.inv_ID 
    FROM Inventory CAT

查询结果如下:

Models                         inv_ID
Pulsar,Hunk                      14
Splender,Hunk                    15
Chaly (CF50),Hunk,CBZ,Splender   16
Pulsar,Hunk                      17
Pulsar,Hunk,CBZ                  18

从上面的查询中可以看出,InventoryMake 表具有表 Inventory 和 Model 的外键。下面显示的是这些表格的插图。

库存表

inv_ID    inv_name
14         abc
15         bcx
16         glx
17         lco
18         btx

InventoryMake 表

inm_id  inv_ID  model_ID
1        2        15
7        3        15
8        5        16
9        3        16
10       4        16
11       2        16
12       1        14
13       3        14
14       1        17
15       3        17

模型表

model_ID   model_name
1           Pulsar
2           Splender
3           Hunk
4           CBZ
5           Chaly (CF50)

我需要做的是找到与 Inventory 表中的 inv_ID 或 Model 表中的 model_name 匹配的用户输入记录。为此,我编辑了如下查询。

  SELECT 
        (STUFF((SELECT ',' + CONVERT(VARCHAR(50),mode.model_name)  
        FROM InventoryMake SUB INNER JOIN Model mode ON SUB.model_ID = mode.model_ID 
        WHERE SUB.inv_ID = CAT.inv_ID FOR XML PATH('')), 1, 1, '' )) [Models],CAT.inv_ID 
    FROM Inventory CAT WHERE CAT.inv_ID  LIKE '%@term%'

从上面的查询中可以找到与 inv_ID 中的词匹配的记录。但我需要找到与 Inventory.inv_ID 或 Model.model_name 匹配的记录。你建议我如何做到这一点? 提前致谢。 PS:我用的是MSSQL

【问题讨论】:

    标签: sql-server inner-join where sql-like


    【解决方案1】:

    我不知道为什么您的查询有一个名为 STUFF 的函数,也不知道 FOR XML PATH('') 是什么。

    我也不确定 '%@term%' 的含义,或者它是否按您的预期工作(它在 MySQL 中不起作用。

    因此,忽略您的查询并查看您提出的问题,我的答案是:

    SELECT     SUB.inm_id, SUB.inv_ID, SUB.model_ID
    FROM       InventoryMake SUB
    INNER JOIN Inventory CAT ON (SUB.inv_ID = CAT.inv_ID)
    INNER JOIN Model         ON (SUB.model_ID = Model.model_ID)
    WHERE      CAT.inv_ID  = @term
       OR      Model.model_name LIKE '%@term%'
    

    请注意,对 CAT.inv_ID 使用 LIKE 没有多大意义。也许您实际上想要的是将用户的输入与 inv_name 进行匹配?

    【讨论】:

    • STUFF 和 FOR XML PATH('') 类似于 MYSQL 中的 GROUP_CONCAT()。不,这不是我所期望的。但是感谢您在这里帮助我。
    • 为什么我的回答没有回复“我需要做的是查找与 Inventory 表中的 inv_ID 或 Model 表中的 model_name 匹配的用户输入记录。”
    • 您的查询是正确的,但您更改了我原来的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2012-04-21
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多