LINUX.ORG.RU

Запрос с использованием массива

 ,


0

1

Использую СУБД PostgreSQL. Для примера, есть таблица 1 столбец - имя владельца 2 столбец - название авто

CREATE TABLE cars (
  id INT NOT NULL,
  name VARCHAR(30) NOT NULL,
  car VARCHAR(30)
);

INSERT INTO cars 
    (id, name, car) 
VALUES 
    (1,'John', 'BMW'),
    (2,'Mike', 'BMW'),
    (3,'John', 'OPEL'),
    (3,'John', 'KIA')
Есть набор названий авто ['BMW', 'KIA'], нужно найти владельцев, которые владели всеми этими авто. Придумал 2 варианта реализации:
SELECT name
FROM cars
WHERE car =  'BMW'
INTERSECT
SELECT name
FROM cars
WHERE car =  'KIA'
Либо
SELECT name
FROM cars
WHERE car =  ANY(ARRAY['BMW', 'KIA'])
GROUP BY name
HAVING COUNT(name) = 2
Вопрос, есть ли другие более оптимальные и простые варианты реализации

select car1.name
 from cars car1
 join cars car2 on
    car1.id=car2.id and car2.car='BMW'
where car1.car='KIA'

и третий вариант.

а что лучше, intersect или join это уже нужно по планам выбирать

anonymous ()

которые владели всеми этими авто

Если ты имел ввиду «каждым из этих авто» (судя по всему так), то «car in (…) group by name having count…» наиболее очевиден.

anonymous ()