Sql server SQL Server 2012,如果存在其他行,则仅显示一行

Sql server SQL Server 2012,如果存在其他行,则仅显示一行,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,问题: 当我运行查询时,我得到以下结果(列任务\u externalId): TC229090-10000-3 TC229090-20000-3 TC229830-10000-3 TC229685-10000-3 一个任务(TC229090)可以包含多行(10000、20000),但也可以只有一行(仅10000行) 我的完整代码: SELECT v.voorgemeld_handmatig, v.voorgemeld, v.mac, v.orn, v.cdm, v.blo,

问题:

当我运行查询时,我得到以下结果(列
任务\u externalId
):

  • TC229090-10000-3
  • TC229090-20000-3
  • TC229830-10000-3
  • TC229685-10000-3
一个任务(
TC229090
)可以包含多行(10000、20000),但也可以只有一行(仅10000行)

我的完整代码:

SELECT 
    v.voorgemeld_handmatig, v.voorgemeld, v.mac, v.orn, v.cdm, v.blo, 
    v.bco, v.tarcode, (v.timeslotfrom + ' - ' + v.timeslottill),      
    cast (case 
             when 
                (Select ac2.actionSpecificationName 
                 From [COMTECdefault].[dbo].[task] t2 
                 Join [COMTECdefault].[dbo].[actionKind] ak2 On t2.id_actionKind = ak2.id_actionKind 
                 Join [COMTECdefault].[dbo].[actionSpecification] ac2 On ak2.id_actionSpecification = ac2.id_actionSpecification 
                 where t2.task_externalId = (left(t.task_externalId, 15) + '2')) = 'laden' 
                then 'Vol' 
                else 'Leeg' 
          end as text) as IMPORT, 
    t.task_externalId, a.addressName, a.cityName, 
    CONVERT(DATE, t.from_date) as [Date], 
    CONVERT(varchar(8), CONVERT(TIME, t.from_date)) as [Tijd],  
    res.resourceName, resk.resourceKindName, r.shipOwner, 
    t.reference, 
    (Select resourceName 
     From [COMTECdefault].[dbo].[resource] r5 
     Left Outer Join [COMTECdefault].[dbo].resourceKind rk5 On rk5.id_resourceKind = r5.id_resourceKind 
     Where (id_resource = SUBSTRING(pt.StartResources, 0, CHARINDEX(',', pt.StartResources)) 
           or id_resource = PARSENAME(REPLACE(SUBSTRING(pt.StartResources, CHARINDEX(',', pt.StartResources) + 1, LEN(pt.StartResources)), ',', '.'), 4) 
           or id_resource = PARSENAME(REPLACE(SUBSTRING(pt.StartResources, CHARINDEX(',', pt.StartResources) + 1, LEN(pt.StartResources)), ',', '.'), 3) 
           or id_resource = PARSENAME(REPLACE(SUBSTRING(pt.StartResources, CHARINDEX(',', pt.StartResources) + 1, LEN(pt.StartResources)), ',', '.'), 2) 
           or id_resource = PARSENAME(REPLACE(SUBSTRING(pt.StartResources, CHARINDEX(',', pt.StartResources) + 1, LEN(pt.StartResources)), ',', '.'), 1)) 
           and r5.id_resourceKind = 51), 
    udo.udf_Gewicht, udo.udf_Zegelnummer, 
    cast (case when a.addressName = 'APM Terminal 2' 
                  then case when udo.udf_Zegelnummer IS NULL 
                               then 0 
                               else 1 
                       end 
               when a.addressName IN ('ect delta', 'Euromax Terminam C.V.', 'Euromax Terminal') 
                  then case when udo.udf_Gewicht = 0 
                               then 0 
                               else 1 
                       end 
               else 1 
          end as bit) as [voormelden],  
    v.foutcode, v.foutcode_tekst, v.V_door 
FROM 
    [COMTECdefault].[dbo].[task] t 
JOIN 
    [COMTECdefault].[dbo].[actionKind] ak ON t.id_actionKind = ak.id_actionKind 
JOIN 
    [COMTECdefault].[dbo].[actionSpecification] ac ON ak.id_actionSpecification = ac.id_actionSpecification 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[resourceOrder] ro ON t.id_order = ro.id_order 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[resource] res ON ro.id_resource = res.id_resource 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[resourceKind] resk ON res.id_resourceKind= resk.id_resourceKind 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[address] a ON t.id_address = a.id_address 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[resourceOrder] r ON t.id_order = r.id_order 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[order] o ON o.id_order = r.id_order 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[voormelden] v ON v.id_task_otd = t.task_externalId 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[ud_order] udo ON udo.id_order = t.id_order 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[plannedTask] pt on t.id_task = pt.id_task
WHERE
    (pt.id_Task IS NULL OR pt.taskstate <> 'finished') 
    AND (v.canceled IS NULL OR v.canceled = 0) 
    AND left(res.resourceName, 4) <> 'XXXU'  
    AND t.canceled = 0 
    AND (t.from_date <= '2016-11-24 23:59:59') 
    AND (ac.actionSpecificationName = 'inleveren') 
    AND a.addressName IN ('APM Terminal 1','APM Terminal 2', 'ect delta', 'rwg', 'Euromax Terminam C.V.', 'Euromax Terminal') 
ORDER BY 
    res.resourceName, a.addressName, t.task_externalId
选择
v、 voorgemeld_Handtig,v.voorgemeld,v.mac,v.orn,v.cdm,v.blo,
v、 bco,v.tarcode,(v.timeslotfrom+'-'+v.timeslottill),
铸造(外壳)
什么时候
(选择ac2.actionSpecificationName
来自[COMTECdefault].[dbo].[task]t2
在t2.id\u actionKind=ak2.id\u actionKind上加入[COMTECdefault].[dbo].[actionKind]ak2
在ak2.id\u actionSpecification=ac2.id\u actionSpecification上加入[COMTECdefault].[dbo].[actionSpecification]ac2
其中t2.task_externalId=(左(t.task_externalId,15)+“2”)=“ladden”
然后是“Vol”
还有“韭菜”
以文本结尾)作为导入,
t、 task_externalId,a.addressName,a.cityName,
将(日期,t.from_DATE)转换为[日期],
将(varchar(8),CONVERT(TIME,t.from_date))转换为[Tijd],
res.resourceName,resk.resourceKindName,r.shipOwner,
t、 参考,
(选择resourceName
来自[COMTECdefault].[dbo].[resource]r5
左外部联接[COMTECdefault].[dbo].rk5.id\u resourceKind=r5.id\u resourceKind上的resourceKind rk5
其中(id_resource=SUBSTRING(pt.StartResources,0,CHARINDEX(',',pt.StartResources))
或id_resource=PARSENAME(替换(子字符串(pt.StartResources,CHARINDEX(',',pt.StartResources)+1,LEN(pt.StartResources)),',',','),4)
或id_resource=PARSENAME(替换(子字符串(pt.StartResources,CHARINDEX(',',pt.StartResources)+1,LEN(pt.StartResources)),',',','),3)
或id_resource=PARSENAME(替换(子字符串(pt.StartResources,CHARINDEX(',',pt.StartResources)+1,LEN(pt.StartResources)),',',','),2)
或者id_resource=PARSENAME(替换(子字符串(pt.StartResources,CHARINDEX(',',pt.StartResources)+1,LEN(pt.StartResources)),',',','),1))
r5.id_resourceKind=51),
udo.udf_Gewicht,udo.udf_Zegelnumer,
强制转换(a.addressName='APM Terminal 2'时的情况)
然后,当udo.udfu zegelnumer为NULL时出现这种情况
然后0
其他1
结束
当a.addressName位于('ect delta'、'Euromax Terminam C.V.、'Euromax Terminal'中时)
然后,当udo.udfu Gewicht=0时出现这种情况
然后0
其他1
结束
其他1
结束为位)为[voormelden],
v、 foutcode,v.foutcode_tekst,v.v_门
从…起
[COMTECdefault].[dbo].[task]t
参加
[COMTECdefault].[dbo].[actionKind]ak ON t.id\u actionKind=ak.id\u actionKind
参加
[COMTECdefault].[dbo].[actionSpecification]ac ON ak.id\u actionSpecification=ac.id\u actionSpecification
左外连接
[COMTECdefault].[dbo].[resourceOrder]ro ON t.id_order=ro.id_order
左外连接
[COMTECdefault].[dbo].[resource]res ON ro.id\u resource=res.id\u resource
左外连接
[COMTECdefault].[dbo].[resourceKind]resk ON res.id\u resourceKind=resk.id\u resourceKind
左外连接
[COMTECdefault].[dbo].[address]a在t.id\U地址=a.id\U地址上
左外连接
[COMTECdefault].[dbo].[resourceOrder]r在t.id\u顺序=r.id\u顺序上
左外连接
[COMTECdefault].[dbo].[order]o上的o.id\U order=r.id\U order
左外连接
v.id\u task\u otd=t.task\u externalId上的[COMTECdefault].[dbo].[voormelden]v
左外连接
[COMTECdefault].[dbo].[ud\U order]udo上的udo.id\U order=t.id\U order
左外连接
[COMTECdefault].[dbo].[plannedTask]pt on t.id_task=pt.id_task
哪里
(pt.id_任务为空或pt.taskstate“finished”)
和(v.cancelled为NULL或v.cancelled=0)
左(res.resourceName,4)“XXXU”
t=0

(t.from_date我不打算涉及所有的文本,很可能会缩小所有的连接等,但下面是使用
task_externalid
列执行所需操作的模式

DECLARE @Table AS TABLE (task_externalid VARCHAR(100))
INSERT INTO @Table VALUES 
('TC229090-10000-3')
,('TC229090-20000-3')
,('TC229830-10000-3')
,('TC229685-10000-3')

;WITH cte AS (
    SELECT
       *
       ,RowNumber = ROW_NUMBER() OVER (PARTITION BY
                    LEFT(task_externalid,CHARINDEX('-',task_externalid) - 1)
                    ORDER BY task_externalid DESC)
    FROM
       @Table
)

SELECT *
FROM
    cte
WHERE
    RowNumber = 1
  • 任务外部ID的大部分
    左侧创建一个分区的
    行编号
  • 通过
    task\u externalid DESC

这三个字段是分开的还是一个长字符串?这是一个长字符串。
ntext
text
image
数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。使用
nvarchar(max)
varchar(max)
,和
varbinary(max)
取而代之。-.您应该消除
强制转换(..…作为文本)
。。。