SQL,自连接

SQL,自连接,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一套数据 name AASADF2 AASADF3 ADSFFD2 ADSFFD3 AAWFWEF SFASFSF ADAQWEW ASDAWFA FSDGFRG AFWEFR2 AFWEFR3 我想检索名称以2或3结尾的数据,并且前6个字符应该匹配 i.e AASADF2 AASADF3 ADSFFD2 ADSFFD3 AFWEFR2 AFWEFR3 我能够使用自连接垂直显示数据 AASADF2 AASADF3 ADSFFD2 ADSFFD3 AFWEFR2 A

我有一套数据

name
AASADF2
AASADF3
ADSFFD2
ADSFFD3
AAWFWEF
SFASFSF
ADAQWEW
ASDAWFA
FSDGFRG
AFWEFR2
AFWEFR3
我想检索名称以2或3结尾的数据,并且前6个字符应该匹配

i.e
AASADF2
AASADF3
ADSFFD2
ADSFFD3
AFWEFR2
AFWEFR3
我能够使用自连接垂直显示数据

AASADF2     AASADF3
ADSFFD2     ADSFFD3
AFWEFR2     AFWEFR3
但我想要水平格式的

AASADF2
AASADF3
ADSFFD2
ADSFFD3
AFWEFR2
AFWEFR3
我们需要为此创建临时表以实现此格式吗 有什么想法吗

  SELECT distinct t1.field FROM TABLE t1 JOIN TABLE t2 
                   ON t1.field != t2.field 
                      AND RIGHT(t1.field,1 ) IN ('2', '3')
                      AND LEFT(t1.field, 6) = LEFT(t2.field,6);
-*********************************************

下面是一个完整的例子

DECLARE @table TABLE
(
  field nvarchar(10)
)

insert @table (field) values ('AASADF2'),
                        ('AASADF3'),
                        ('ADSFFD2'),
                        ('ADSFFD3'),
                        ('AAWFWEF'),
                        ('SFASFSF'),
                        ('ADAQWEW'),
                        ('ASDAWFA'),
                        ('FSDGFRG'),
                        ('AFWEFR2'),
                        ('AFWEFR3');



SELECT distinct t1.field FROM @table t1 JOIN @table t2 
                   ON t1.field != t2.field 
                      AND RIGHT(t1.field,1 ) IN ('2', '3')
                      AND LEFT(t1.field, 6) = LEFT(t2.field,6)
输出

field
----------
AASADF2
AASADF3
ADSFFD2
ADSFFD3
AFWEFR2
AFWEFR3

(6 row(s) affected)

这就是你想要的吗:

select t.*
from table t
where right(nm, 1) in ('2', '3') and
      exists (select 1 from table t1 where left(t1.nm, 6) = left(t.nm, 6))

一种方法使用窗口函数:

select t.*
from (select t.*, count(*) over (partition by left(t.field, 6)) as cnt
      from t
     ) t
where cnt > 1 and field like '%[23]';

我能够检索到部分结果, 如果我们检查count>1,它将显示我正在寻找的结果,我使用下面的查询

);派生表 从t_name t1中选择t1.name

其中substringt1.name,8,1 in 从t_name t2中选择substringt2.name、8、1 哪里 substringt2.name,8,1='2' 或substringt2.name,8,1='3'

B2018BT21 B2018BU2 1 B2018BV2 1 B2018BW2 1 B2018BX2 1 B2018BY2 1 B2018BZ2 1 B2020AA2 2 B2020AA3 2 B2020AB2 2 B2020AB3 2 B2020AC2 2 B2020AC3 2


有人能建议如何在计数大于1时执行文件管理器吗?

请发布您当前的查询。感谢您的回复,但它不起作用,因为存在leftt.nm,6,'t'表示无效对象,因为它的作用域在子目录中query@PEL1. . . 对于外部查询和子查询,您需要用实际的表名替换表。我这样做了,我只是保留了一个“t”以供您理解。如果您添加一行“zzzz 3”,您将看到代码似乎不起作用感谢您的答复,但它没有按预期显示数据0 down vote accept我能够检索部分结果,如果我们检查count>1,它将显示我正在寻找的结果,我使用下面的查询;将cte设置为从t_name t1中选择t1.name,其中子字符串t1.name,8,1在选择子字符串t2.name,8,1从t_name t2中选择t1.name,其中子字符串t2.name,8,1='2'或子字符串t2.name,8,1='3'B2018BT2 1 B2018BU2 1 B2018BV2 1 B2018BW2 1 B2018BX2 1 B2018BZ2 1 B2020AA2 B2020AA3 2 B2020AB2 B2020AB3 2 B2020AC2 B2020AC3 2有人能建议如何进行计数大于1的文件管理器吗?对不起,我不明白您想要什么结果。