/ / SQL Server 2008 R2: Точно съвпадение на множество стойности в WHERE - sql-server, sql-server-2008-r2

SQL Server 2008 R2: Точно съвпадение на няколко стойности в WHERE - sql-server, sql-server-2008-r2

Имам следната таблица:

create table person
(
id int,
name varchar(20),
games varchar(20)
);

insert into person values(1,"A","Cricket"),(1,"A","F1"),(2,"B","Cricket"),(3,"C","Cricket"),(3,"C","F1")

Очакван резултат:

id name games
--------------
1   A   Cricket
1   A   F1
3   C   Cricket
3   C   F1

Моят опит 1:

SELECT * FROM person
WHERe games = "Cricket"
AND games = "F1"

Изход: Нищо

Моят опит 2:

SELECT * FROM person
WHERe games IN("Cricket","F1")

изход:

id  name    games
-------------------
1   A   Cricket
1   A   F1
2   B   Cricket     ---This should not come
3   C   Cricket
3   C   F1

Отговори:

1 за отговор № 1

Първо, групирайки го по име, за игри и след това изберете кой ще участва в повече от една игра.

select a.* from
person as a,
(
select id,count(*) as total
from
person
where
games in ("Cricket","F1")
group by id,name
)as b
where
a.id = b.id
and b.total >=2

изход:

id  name    games
1   A       Cricket
1   A       F1
3   C       Cricket
3   C       F1

1 за отговор № 2
SELECT
*
FROM person a
WHERE
games IN("Cricket","F1")    AND
(
SELECT COUNT(Id)
FROM person
WHERE
Id =  a.Id
) = 2

Или по-универсален

;WITH model AS
(
SELECT * FROM (VALUES("Cricket"),("F1")) a(Games)
)
SELECT
a.*
FROM
person a
INNER JOIN
model   b
ON
a.games = b.games
WHERE
(
SELECT COUNT(Id)
FROM person
WHERE
Id =  a.Id
) =
(
SELECT COUNT(*)
FROM model
)

1 за отговор № 3

Ти си толкова близо :)

SELECT * FROM person
WHERE games IN ("Cricket","F1") AND Name IN ("A", "C")

1 за отговор № 4

Една от възможностите е да се използва OVER-включете, за да преброите броя на игрите на идентификатор в определения ви филтър:

;WITH t AS
(
SELECT *,
COUNT(id) OVER(PARTITION BY id) AS cnt
FROM person
WHERE games IN("Cricket","F1")
)
SELECT id, name, games FROM t
WHERE cnt > 1

0 за отговор № 5

Можете също да преброите, където има повече от една стойност (тогава има няколко стойности и след това вътрешни се присъединят към тях с таблицата, за да съответстват на редовете)

select x.id,b.games,b.name from (
select id,count(id) as Total from person

group by id
having count(id) > 1
) x
inner join person b on x.id = b.id

резултат

въведете описанието на изображението тук