ПОДЗАПРОС SQL НА SELF

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть таблица со следующими данными:

 licence_number
date_of_birth
organisation
 

Я хочу выполнить запрос, в котором:

Получите licence_numbers и dob в organization1, где те же номера лицензий и dob находятся в organization2.

Я знаю, что это не может быть так сложно, но я изо всех сил.

Комментарии:

1. Изо всех сил? Пожалуйста, покажите результаты вашей борьбы.

2. Это действительно плохой признак того, что пользователи с высокой репутацией отвечают на вопросы, не требующие никаких усилий со стороны OP, даже если OP приложил к этому какие-либо усилия. Смотрите здесь сам: 2 ответа пользователей, чья общая репутация превышает 100 тыс.

3. @SatwikNadkarny Ну, я не говорю, что это хороший вопрос, но причина закрытия «должен отображать минимальное понимание» исчезла, и проблема, насколько я вижу, четко сформулирована. Если вы видите подходящую причину закрытия, не стесняйтесь голосовать за закрытие.

4. @JoachimIsaksson Дело здесь не в «минимальном понимании». Речь идет о помощи и руководстве людьми в той области, в которой они испытывают трудности. Вопрос не содержит никаких признаков усилий и является скорее вопросом типа «дайте мне код, пожалуйста». Вот в чем проблема!!

5. @JoachimIsaksson И, кстати, простое утверждение «я борюсь» не может рассматриваться как «реальное усилие», если это то, что вы думаете.

Ответ №1:

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

Если в одной группе есть два из двух возможных, у вас есть попадание.

 SELECT license_number, date_of_birth
FROM mytable
WHERE organisation IN ('organisation1', 'organisation2')
GROUP BY license_number, date_of_birth
HAVING COUNT(DISTINCT organisation) = 2;
 

… или вы можете использовать INTERSECT ;

 SELECT license_number, date_of_birth
FROM mytable WHERE organisation = 'organisation1'
INTERSECT
SELECT license_number, date_of_birth
FROM mytable WHERE organisation = 'organisation2'
 

SQLFiddle для тестирования обоих.

Комментарии:

1. Что заставляет вас думать, что есть две таблицы? И вы получаете одинаковую организацию от обоих. В чем смысл?

2. @ClodoaldoNeto Спасибо, вы абсолютно правы. Я обновил ответ, чтобы ответить на правильную вещь 🙂

3. Спасибо, intersect — это то, что мне было нужно. По какой-то причине я пытался выполнить объединения. Полностью забыл о intersect.

Ответ №2:

 select 
from t t0
where
    organization = 'organization1'
    and
    exists (
        select 1
        from t
        where
            organization = 'organization2'
            and
            licence_number = t0.licence_number
            and
            date_of_birth = t0.date_of_birth
    )
 

Комментарии:

1. @joop Вероятно, потому, что даунвотер не понял ни вопроса, ни ответа

Ответ №3:

Вы можете просто самостоятельно присоединиться к таблице, в которой номер лицензии и даты совпадают, а организация — нет:

 SELECT DISTINCT p1.licence_number, p1.date_of_birth
FROM people p1
INNER JOIN people p2
ON p1.licence_number = p2.licence_number AND
p1.date_of_birth = p2.date_of_birth AND
p1.organisation <> p2.organisation
 

SQL-скрипка здесь

Ответ №4:

Это ОБЪЕДИНЕНИЕ или 1 таблица?

 Select 

[licence_number],
[date_of_birth],
[organisation]
From YourTable
Where organisation1 = organisation2

--OR 

Select 

[licence_number],
[date_of_birth],
[organisation]
From YourTable
Where organisation1 IN ('organisation2','organisation3','organisation3')
Order By [licence_number]
 

Комментарии:

1. Это недопустимый SQL (для Postgres и любой другой стандартной базы данных).

2. Вам нужен открытый исходный код, а затем MySQL