Как запросить соответствие строк для конкретной строки? - PullRequest
0 голосов
/ 27 ноября 2018

Так выглядит таблица, и здесь Empid и idnumber были уникальными для каждого сотрудника, а также у сотрудника может быть несколько значков с различным номером.

enter image description here

Теперь я хочу отфильтровать сотрудников, чей значок начинается с 6542 и 3214, то есть сотрудников, имеющих оба значка, начиная с 6542 и 3214

Спасибо

UPdate 1

Есть некоторые записи, которые имеют только один значок, начиная с 6542 или 3214.но я хочу только сотрудников, которые несут оба значка.

Ответы [ 5 ]

0 голосов
/ 27 ноября 2018

просто делай так

    Select a.empid, a.name 
    from TableName as a
    inner join TableName as b on a.Empid = b.Empid and a.idnumber = b.idnumber and b.badge like '3214%'
    where a.badge like '6542%'
0 голосов
/ 27 ноября 2018

Мы можем использовать COUNT DISTINCT с CASE в HAVING, как показано ниже

DECLARE @test AS TABLE(EMPID INT, Badge VARCHAR(50), idNumber INT, EName VARCHAR(50))
INSERT INTO @test VALUES
(1148, '6542-74488', 66448, 'Adam Jhon'),
(1148, '642-8562', 66448, 'Adam Jhon'),
(1148, '3214-52874', 66448, 'Adam Jhon'),

(1149, '3214-45220', 209541, 'Tom Koyaski'),
(1150, '3214-23134', 63339, 'Shirin Abdulla'),
(1151, '3214-42355', 65498, 'Linda Jhon'),

(1151, '6542-2546', 65498, 'Linda Jhon'),
(1152, '3214-47632', 208673, 'Gayeth'),
(1153, '6542-73085', 83209, 'Maria Smith'),

(1153, '3214-58073', 65498, 'Maria Smith'),
(1154, '3214-26735', 208673, 'Ayan Jacob'),
(1155, '642-26739', 53959, 'Wo Li')

SELECT empid, Ename 
FROM @test 
WHERE badge LIKE '6542%' OR badge LIKE '3214%'
GROUP BY empid, Ename
HAVING COUNT (DISTINCT(CASE WHEN badge like '6542%' THEN 1 
                WHEN badge LIKE '3214%' THEN 2 END))>1

ВЫХОД :

empid   Ename
1148    Adam Jhon
1151    Linda Jhon
1153    Maria Smith
0 голосов
/ 27 ноября 2018

Сделайте GROUP BY, используйте HAVING для обеспечения обоих значков:

select empid, name
from Table
where badge like '6542-%' or badge like '3214-%'
group by empid, name
having count(distinct badge) > 1

Или используйте INTERSECT:

select empid, name from Table where badge like '6542-%'
intersect
select empid, name from Table where badge like '3214-%'
0 голосов
/ 27 ноября 2018

это будет работать:

select empid from table_name where regexp_like(Badge,'^(6542)(.*)$')
intersect
select empid from table_name where regexp_like(Badge,'^(3214)(.*)$');

SQL Server эквивалент:

select empid from table_name where PATINDEX ('^(6542)(.*)$',Badge)  !=0
intersect
select empid from table_name where PATINDEX ('^(6542)(.*)$',Badge)  !=0
0 голосов
/ 27 ноября 2018

Просто используйте как на поле значка

    Select empid, name 
    from TableName 
    where badge like '6542%' or badge like '3214%'
    group by empid, name
    having count(*)>1
...