【问题标题】:Select items like records from a column in another table从另一个表的列中选择项目,如记录
【发布时间】:2018-02-14 22:17:27
【问题描述】:

我有一个包含大量记录的表 (foo),我只想选择那些与另一个表 (foo2) 中的字段中的一条记录相似的记录

如果我使用内部连接执行 SELECT 查询

SELECT pst_qty AS [QTY]
  ,[MFGPN]
  ,[mfg_name] AS [MANUFACTURER]
  ,description
  ,sup_id
  FROM [foo]
  INNER JOIN [foo2]
  ON [foo].[MFGPN] = [foo2].TestString

afaik 我只会得到 foo.field1=foo2.field1 的记录。我似乎无法使用 ON foo.field1 LIKE foo2.field2 来选择像 foo2 中的字段这样的记录。我将如何选择与不同表中的列中的记录类似的记录?

【问题讨论】:

  • 您能否详细说明,例如,您能否列出您的 foo2 表的列?

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


【解决方案1】:

你有没有尝试过类似的东西

SELECT pst_qty AS [QTY] 
  ,[MFGPN] 
  ,[mfg_name] AS [MANUFACTURER] 
  ,description 
  ,sup_id 
  FROM [foo] 
  INNER JOIN [foo2] 
  ON [foo].[MFGPN] LIKE '%' + [foo2].TestString + '%'

【讨论】:

  • 真棒答案!
【解决方案2】:

怎么样,

SELECT DISTINCT
            F.[pst_qty] [QTY],
            F.[MFGPN], 
            F.[mfg_name] [MANUFACTURER], 
            F.[description], 
            F.[sup_id] 
    FROM
            [foo] F 
        CROSS JOIN
            [foo2] F2
    WHERE
             CHARINDEX(F2.[MFGPN], F.[TestString]) > 0;

注意,如果字符串包含'%' 通配符,这将起作用。

【讨论】:

  • 是的。所有其他答案都受到通配符注入(如果有的话)。
【解决方案3】:
SELECT pst_qty AS [QTY]
.
.
.
  FROM [foo]
       where [foo].[MFGPN] LIKE '%123%'
             or [foo].[MFGPN] LIKE '%123%'
             or [foo].[MFGPN] LIKE '%123%'

可以,但需要进行全表扫描,因为该列上的任何索引都将被忽略。因此,可以尝试以下代替它。

SELECT pst_qty AS [QTY]
.
.
.
  FROM [foo]
  INNER JOIN [foo2]
        ON [foo].[MFGPN] LIKE '%' + [foo2].TestString + '%'

【讨论】:

  • 根据您的第二个建议,索引也将被忽略。可能无法在使用 LIKE '%something%' 测试的列上启用索引使用。
  • 是的,Andriy,你可能对我的第二个建议是正确的。我刚刚在执行流程中检查了它。但至少它给出了 user1542296 发布的查询的答案 :)
  • @AndriyM 带有前导通配符的表达式不能从索引中受益。表现会很糟糕。如果性能有问题,请调查全文索引
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多