SQL自连接

时间:2018-07-31 13:22:59

标签: 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     AFWEFR3

但是我想要水平格式

AASADF2
AASADF3
ADSFFD2
ADSFFD3
AFWEFR2
AFWEFR3

我们是否需要为此创建临时表才能达到这种格式 有什么想法吗?

4 个答案:

答案 0 :(得分:1)

这是您想要的吗?

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))

答案 1 :(得分:0)

  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)

答案 2 :(得分:0)

一种方法使用窗口函数:

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]';

答案 3 :(得分:0)

我能够检索部分结果, 如果我们检查count> 1会显示我想要的结果,则使用以下查询

;使用cte作为 (从t_name t1中选择t1.name

其中子字符串(t1.name,8,1)在  (  从t_name t2中选择子字符串(t2.name,8,1)  哪里   substring(t2.name,8,1)='2'  或子字符串(t2.name,8,1)='3'   )   )

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

有人可以建议如何对count> 1进行文件处理吗?