Несопоставленные строки со значениями из обеих таблиц

У меня есть две таблицы T1:

+----+-----+--------------------+----------+
| ID | emp |     manager        |     proj |
+----+-----+--------------------+----------+
|  1 | Sam |     Tom            |       aa |
|  1 | Sam |     Tom            |       bb |
|  1 | Sam |     Tom            |       cc |
|  1 | Sam |     Tom            |       dd |
+----+-----+--------------------+----------+

Таблица T2:

+--------+---------+--------+-----------+
| Course |  Type   | proj   | Category  |
+--------+---------+--------+-----------+
| XYZ    |     NEW |     aa |    a      |
| DWE    |     OLD |     bb |    b      |
| RTY    |     OLD |     ii |    c      |
| UIO    |     NEW |     gg |    d      |
+--------+---------+--------+-----------+

ВЫХОД:

+-----------+-----+----------+--------+---------+---------+----------+
|    ID     | emp |  manager |  proj  | Course  |  Type   | Category |
+-----------+-----+----------+--------+---------+---------+----------+
|         1 | Sam |  Tom     |     ii |     RTY |     OLD |     c    |
|         1 | Sam |  Tom     |     gg |     UIO |     NEW |     d    |
+-----------+-----+----------+--------+---------+---------+----------+

У меня есть один общий col proj, в таблице 1 есть проект, сделанный emp, table2 имеет как proj done, так и не сделанный emp с дополнительными полями. Я хочу получить все несопоставленные строки из таблицы 2, но с атрибутами из таблицы 1, как указано выше. Может кто-нибудь помочь с SQL-запросом сделать это ??

Это то, что вы хотите, или то, что вы получаете сейчас? Если это не желаемое, можете ли вы добавить это?

TomC 10.08.2018 03:57

Какова логика, по которой сотрудник Sam и менеджер Tom приводятся к ожидаемому результату? Эта информация поступает из первой таблицы, но, по определению, нет никакого отношения к этой таблице из второй таблицы.

Tim Biegeleisen 10.08.2018 03:57

@TimBiegeleisen отредактировал его, чтобы сделать его более читаемым, надеюсь, что это сработает

my_way 10.08.2018 03:58

@TomC вывод, который я хочу

my_way 10.08.2018 03:58

@TimBiegeleisen единственный общий столбец - это proj, и все, что есть против sam для управляющих потоков на выход, в основном мне нужны незавершенные проекты со всеми атрибутами SAM, как из таблицы1

my_way 10.08.2018 04:00

Это не ответ на мой вопрос.

Tim Biegeleisen 10.08.2018 04:01

Я не очень понимаю, как получить строки из таблицы 1.

The Impaler 10.08.2018 04:01

Есть ли в этой таблице такие вещи, как внешние ключи? Есть ли источник для «ID» - т.е. из какой таблицы он берется (в какой таблице этот идентификатор используется в качестве первичного ключа)? Кроме того, вы не упоминаете другие их столбцы в этих таблицах. Дизайн на первый взгляд выглядит как беспорядок

Joe Love 10.08.2018 04:02

@my_way Я думаю, что ваша модель базы данных не 3NF. В таблице 1 есть столбцы, которые должны быть в двух отдельных таблицах. Кроме того, можете ли вы добавить внешние ключи?

The Impaler 10.08.2018 04:04

@JoeLove люблю нет, единственные общие столбцы - это proj, да, исходные данные испорчены, и, следовательно, я не могу получить данные из таблицы 1

my_way 10.08.2018 04:04

В вашем примере вы получаете каждого отдельного сотрудника из T1. Это то, что вы хотите? Итак, если есть 5 сотрудников, вы получите каждый непревзойденный проект с каждым сотрудником?

TomC 10.08.2018 04:05

Модель базы данных слишком испорчена. Голосование закрыто.

The Impaler 10.08.2018 04:05

@TomC да, именно каждый сотрудник с его данными из таблицы 1, прикрепленными к невыполненным проектам из таблицы 2

my_way 10.08.2018 04:06

@TheImpaler Ограничения (FK, NF) не требуются для запроса. Необходимо то, что строки таблицы вывода и ввода говорят о ситуации. Конечно, входных данных может быть недостаточно для желаемого результата, но это не вопрос ограничений.

philipxy 10.08.2018 08:26

@TimBiegeleisen Ограничения (включая FK) не требуются для запроса. Любые две таблицы могут быть осмысленно объединены. Здесь строки обеих таблиц что-то говорят о проекте, поэтому ряд их объединения говорит что-то о проекте каждой из них. Необязательно, что, скажем, проект, участвующий с некоторыми значениями в одной таблице / взаимосвязи / ассоциации, подразумевает, что он участвует с некоторыми значениями в другой - что было бы в случае, когда выполняется FK.

philipxy 10.08.2018 08:38

@philipxy Отличный комментарий. Но тогда почему вы не опубликовали ответ, если на вопрос явно можно ответить?

Tim Biegeleisen 10.08.2018 08:40

Вы действительно имеете в виду, что здесь задействован только один сотрудник, и в обеих таблицах есть данные только для этого сотрудника? Что именно говорит строка, будучи ей для каждой таблицы?

philipxy 11.08.2018 10:14

@TimBiegeleisen Я раскритиковал несколько вводящих в заблуждение комментариев; Ответственность - это отдельный вопрос. Сообщение не ясно относительно "несогласованного", но, принимая очевидное значение различных проектов, за него следует отвечать, потому что результат описан в терминах просто "несогласованные" и табличные значения, а не в терминах значений таблиц. Но даже если "несогласованные" задействованы понятия приложения, таблица 2 предназначена для того же сотрудника, что и таблица 1, поэтому мы можем объединить их для получения данных по этому сотруднику. (На «что говорят входные и выходные строки» - а не ограничения.) Но я подозреваю, что спрашивающий хочет, чтобы входные данные касались многих сотрудников, поэтому я попросил ясности и минимальный воспроизводимый пример.

philipxy 12.08.2018 01:33
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
18
55
3

Ответы 3

Попробуй это

with a as (
select T2.* from T1 right join T2 
on T1.proj=T2.proj
where T1.proj is null) ,

 b as (select T1.id, T1.emp, t1.manager from T1 left join T2 
on T1.proj=T2.proj
group by T1.id, T1.emp, t1.manager,T2.proj
having T2.proj is null)

select * from a cross join b

Я не думаю, что это правильно. Он хочет анти-соединение, а не внешнее соединение.

The Impaler 10.08.2018 04:07

@TheImpaler, вы можете предложить, как можно улучшить дизайн, а не закрывать его! Я могу модулировать table1, но не table 2

my_way 10.08.2018 04:12

@my_way надеюсь, вы получили результат после моей модификации

Indrakumara 10.08.2018 04:38
select e.ID, e.emp, e.manager, t2.proj, t2.Course, t2.Type as Name, t2.Category
from t2
cross join (select distinct ID, emp, manager from T1) e
where not exists(select * from t1 where t1.prog=t2.proj)

Я использую oracle, и он выдает ошибку с отсутствующим ключевым словом, нужно ли нам указывать условие соединения «on»?

my_way 10.08.2018 04:33

Да, вы правы - должно быть перекрестное соединение. Я обновил запрос.

TomC 10.08.2018 05:15

ВЫБЕРИТЕ tbl.ID, tbl.emp, tbl.manager, t2.proj, t2.Course, t2.Type as Name, t2.Category
ИЗ ( ВЫБЕРИТЕ t2.ID, t2.emp, t2.manager ИЗ Table2 t2 ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ Table1 t1, ГДЕ t1.proj = t2.proj) ) tbl CROSS APPLY Table1 t1

Прочтите справку по редактированию кода форматирования, посмотрите отформатированную версию своего ответа и нажмите «Изменить», чтобы отредактировать ее.

philipxy 11.08.2018 00:05

Другие вопросы по теме