【问题标题】:How to join unrelated table in WHERE name from unrelated table is contained in text field如何从不相关的表中加入 WHERE 名称中的不相关表包含在文本字段中
【发布时间】:2018-03-07 12:36:26
【问题描述】:

我已经阅读了我能找到的所有关于不相关表连接的帖子,但似乎没有任何内容可以帮助我(我能理解)。 我有 2 个临时表,我需要表 2 只包含其中的行 文本字段包含 table1 中的任何一个名称。这两个表之间没有直接联系。

表 1 示例:
table1.fullname
一个名字
b 名称
c名
名称

表 2 中“主题”列的摘录:
主题
对巴哈马的食品出口市场研究报告
初始电信
名称 - 更新调用以检查进度
更新调用以检查名称的进度
b 名字 - 遇见安娜
建议彼得 - b name
c name- 协助完成资助申请。
d 名称 - 建议

我只需要表 2 中包含主题字段中 table1 中的任何名称的行。

我使用过类似的东西: WHERE table2.subject LIKE '%'+table1.fullname+'%' 但它不起作用,因为我没有以任何方式加入表格。 大多数帖子似乎都建议使用交叉连接,但由于两个表都非常大,我认为这不是最好的方法。 我认为我应该使用子查询,但无法弄清楚如何加入。 到目前为止我的代码:

IF OBJECT_ID('tempdb.dbo.#ITA', 'U') IS NOT NULL 
DROP TABLE #ITA SELECT        *
INTO            #ITA
FROM            (select distinct fullname
from FilteredContact
Where (jobtitle LIKE 'International Trade Adviser%'))InternationalTradeAdviser;

IF OBJECT_ID('tempdb.dbo.#ITAactivity', 'U') IS NOT NULL 
DROP TABLE #ITAactivity SELECT        *
INTO            #ITAactivity
FROM            (SELECT distinct     FilteredAppointment.activityid as ActivityID, Filteredccx_project.ccx_customerid AS CompanyID,  Filteredccx_project.ccx_projectnumber AS ProjectNumber,
                                CONVERT(varchar, FilteredAppointment.scheduledstart, 103) AS ConvertedTime, 
                                FilteredAppointment.actualdurationminutes, FilteredAppointment.actualdurationminutes / 60 AS Hours, FilteredAppointment.actualdurationminutes % 60 AS Minutes,
                                'International Trade Adviser' As TypeOfService
                FROM            FilteredAppointment INNER JOIN
                Filteredccx_project ON FilteredAppointment.regardingobjectid = Filteredccx_project.ccx_projectid
                WHERE        (FilteredAppointment.statecode = 1) AND (FilteredAppointment.subject LIKE '%'+#ITA.fullname+'%') AND
                (Filteredccx_project.ccx_programme IN ('04D0B1DF-FD36-E611-8870-005056A52209','14286237-FE36-E611-8870-005056A52209')) AND
                Filteredccx_project.ccx_projectstatus IN(803080000,803080001) AND 
                Filteredccx_Project.ccx_runningtotal>=12)ITAactivities;

我尝试在 WHERE 子句中使用子查询,但这会产生错误消息,因为它返回多于 1 行。

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 对不起。现在会这样做

标签: sql-server sql-server-2008


【解决方案1】:

既然你说你只想要包含全名的记录,你也可以在where子句中使用exists

为此,更换零件

AND (FilteredAppointment.subject LIKE '%'+#ITA.fullname+'%')

有了这个

AND exists (select 1
              from #ITA it
             where FilteredAppointment.subject like '%' + it.fullname + '%')

最后的插入看起来像这样:

SELECT *
  INTO #ITAactivity
  FROM (SELECT distinct
               FilteredAppointment.activityid as ActivityID,
               Filteredccx_project.ccx_customerid AS CompanyID,
               Filteredccx_project.ccx_projectnumber AS ProjectNumber,
               CONVERT(varchar, FilteredAppointment.scheduledstart, 103) AS ConvertedTime,
               FilteredAppointment.actualdurationminutes, FilteredAppointment.actualdurationminutes / 60 AS Hours, FilteredAppointment.actualdurationminutes % 60 AS Minutes,
               'International Trade Adviser' As TypeOfService
          FROM FilteredAppointment
                 INNER JOIN
               Filteredccx_project ON FilteredAppointment.regardingobjectid = Filteredccx_project.ccx_projectid
         WHERE (FilteredAppointment.statecode = 1)
           AND (Filteredccx_project.ccx_programme IN ('04D0B1DF-FD36-E611-8870-005056A52209', '14286237-FE36-E611-8870-005056A52209'))
           AND Filteredccx_project.ccx_projectstatus IN (803080000, 803080001)
           AND Filteredccx_Project.ccx_runningtotal >= 12
           AND exists (select 1
                         from #ITA it
                        where FilteredAppointment.subject like '%' + it.fullname + '%'))ITAactivities;

【讨论】:

  • 格式很好 - 这是一个巨大的改进。对于 OP - 没有任何充分的理由使用派生表,我怀疑 distinct 没有任何用处。应始终使用强制转换 (varchar(?)) 指定长度 - 样式 103 具有固定长度,因此 varchar 应该是真正的 char。
  • 它是一个派生表,因为它需要并且是更大查询的一部分。感谢您提供 varchar/char 提示。现在将尝试上面的回复并让您知道
  • 效果很好。太感谢了。如此简单,但我的大脑就是无法到达那里。再次感谢您。
【解决方案2】:

这种动态技术可能有用:

Declare @FullNames as nvarchar(max)
Declare @Sql as nvarchar(max)

select @FullNames = 
    stuff((
        select distinct ' or subject like ''%' + [fullname] + '%'''
        from t1
        for xml path('')
    ),1,3,'') as x

set @Sql = 'SELECT        *
            INTO            #ITAactivity
            FROM            (SELECT distinct     FilteredAppointment.activityid as ActivityID, Filteredccx_project.ccx_customerid AS CompanyID,  Filteredccx_project.ccx_projectnumber AS ProjectNumber,
                            CONVERT(varchar, FilteredAppointment.scheduledstart, 103) AS ConvertedTime, 
                            FilteredAppointment.actualdurationminutes, FilteredAppointment.actualdurationminutes / 60 AS Hours, FilteredAppointment.actualdurationminutes % 60 AS Minutes,
                            ''International Trade Adviser'' As TypeOfService
            FROM            FilteredAppointment INNER JOIN
            Filteredccx_project ON FilteredAppointment.regardingobjectid = Filteredccx_project.ccx_projectid
            WHERE        (FilteredAppointment.statecode = 1) AND (FilteredAppointment.subject LIKE ''%''+#ITA.fullname+''%'') AND
            (Filteredccx_project.ccx_programme IN (''04D0B1DF-FD36-E611-8870-005056A52209'',''14286237-FE36-E611-8870-005056A52209'')) AND
            Filteredccx_project.ccx_projectstatus IN(803080000,803080001) AND 
            Filteredccx_Project.ccx_runningtotal>=12)ITAactivities AND (' + @FullNames + ')'

exec(@Sql)

【讨论】:

  • 感谢您的回复。我已经使用了之前回复中的“存在”,但是我很感谢您的回复。虽然我之前使用过这种类型的代码,但它有点超出我的能力,但我会花一些时间来完成它以扩展我的学习。再次感谢您
猜你喜欢
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多