У меня есть две SQL-таблицы, как это:

T1

Animal   Name
Cat      Paul
Cat      Miau
Cat      Paul
Cat      Peter

T2

Legs   Name
4      Paul
4      Miau
3      Paul
4      Peter

Я хочу иметь такую таблицу:

Animal   Legs   Name
Cat       4     Miau
Cat       4     Peter

Я хочу, чтобы все животные имели определенное количество ног, но не тогда, когда у нас есть две кошки с одинаковым именем.

Я пытался сделать что-то вроде этого:

select  a.animal, b.legs, a.name
from animallistA as a join animallistB as b
on a.name = b.name 
where b.legs = 4 and not b.legs = 3
group by a.animal, b.legs, a.name

Если я скажу where b.legs = 4, то я также получу «Пола», но если я скажу where b.legs = 4 and not b.legs = 3, я вообще ничего не получу.

Есть ли способ не получить кошек, имеющих одинаковое имя и 4 ноги, но не тех, которые имеют то же имя, но 4 или меньше (или больше) ног.

0
Jane_Doe 1 Сен 2017 в 14:53

4 ответа

Лучший ответ

Насколько я понял ваш вопрос, предлагаю следующий запрос:

SELECT A.ANIMAL, A.NAME, B.LEGS 
FROM ANIMALLISTA A
INNER JOIN ANIMALLISTB B ON A.NAME = B.NAME
LEFT JOIN (SELECT NAME, COUNT(*) AS RC FROM ANIMALLISTB GROUP BY NAME) C ON A.NAME = C.NAME
WHERE B.LEGS=4
 AND C.RC=1

Выход:

ANIMAL  NAME    LEGS
Cat Miau    4
Cat Peter   4
0
etsa 1 Сен 2017 в 12:10

NOT EXISTS может сделать эту работу.

SELECT t1.animal, t2.legs, t2.name
FROM t1
JOIN t2 ON t1.name = t2.name
WHERE t2.legs = 4 AND 
      NOT EXISTS 
      (
          SELECT 1 FROM t2 WHERE t2.name = t1.name AND t2.legs != 4
      )
1
Radim Bača 1 Сен 2017 в 11:59

Вы можете сначала взять все уникальные имена животных с 4 ногами (из подзапроса), а затем присоединиться к основному столу, чтобы получить требуемый результат.

    select  a.animal, b.legs, a.name from animallistA as a join 
    (select name,max(legs) legs from animallistB  group by name having count(distinct legs)=1) as b
     on a.name = b.name and b.legs=4

Из подзапроса мы можем получить результат

Legs   Name
4      Miau
4      Peter

Потому что разные значения наличия условия не выполняются для Paul. Соединение этого с основной таблицей дает запрошенный результат

1
Rams 1 Сен 2017 в 12:52

Вы можете попробовать что-то вроде этого, работал для меня на My SQL 8.0.2 || cat_1 = T1 и cat_2 = T2

WITH CTE AS 
(
SELECT distinct * 
FROM cat_1 
INNER JOIN cat_2 ON cat_1.names=cat_2.name
),

SCTE AS
(
SELECT CTE.animal, 
CTE.legs, 
CTE.names, 
COUNT(CTE.names) over(PARTITION BY CTE.names) as Count
from CTE
)

SELECT 
SCTE.animal, 
SCTE.legs, 
SCTE.names
FROM SCTE
WHERE legs = 4
AND Count = 1; 

Выход:

animal   legs   names
Cat       4     Miau
Cat       4     Peter
0
Newbie92 1 Сен 2017 в 19:21