У меня есть две таблицы 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-запросом сделать это ??
Какова логика, по которой сотрудник Sam
и менеджер Tom
приводятся к ожидаемому результату? Эта информация поступает из первой таблицы, но, по определению, нет никакого отношения к этой таблице из второй таблицы.
@TimBiegeleisen отредактировал его, чтобы сделать его более читаемым, надеюсь, что это сработает
@TomC вывод, который я хочу
@TimBiegeleisen единственный общий столбец - это proj, и все, что есть против sam для управляющих потоков на выход, в основном мне нужны незавершенные проекты со всеми атрибутами SAM, как из таблицы1
Это не ответ на мой вопрос.
Я не очень понимаю, как получить строки из таблицы 1.
Есть ли в этой таблице такие вещи, как внешние ключи? Есть ли источник для «ID» - т.е. из какой таблицы он берется (в какой таблице этот идентификатор используется в качестве первичного ключа)? Кроме того, вы не упоминаете другие их столбцы в этих таблицах. Дизайн на первый взгляд выглядит как беспорядок
@my_way Я думаю, что ваша модель базы данных не 3NF. В таблице 1 есть столбцы, которые должны быть в двух отдельных таблицах. Кроме того, можете ли вы добавить внешние ключи?
@JoeLove люблю нет, единственные общие столбцы - это proj, да, исходные данные испорчены, и, следовательно, я не могу получить данные из таблицы 1
В вашем примере вы получаете каждого отдельного сотрудника из T1. Это то, что вы хотите? Итак, если есть 5 сотрудников, вы получите каждый непревзойденный проект с каждым сотрудником?
Модель базы данных слишком испорчена. Голосование закрыто.
@TomC да, именно каждый сотрудник с его данными из таблицы 1, прикрепленными к невыполненным проектам из таблицы 2
@TheImpaler Ограничения (FK, NF) не требуются для запроса. Необходимо то, что строки таблицы вывода и ввода говорят о ситуации. Конечно, входных данных может быть недостаточно для желаемого результата, но это не вопрос ограничений.
@TimBiegeleisen Ограничения (включая FK) не требуются для запроса. Любые две таблицы могут быть осмысленно объединены. Здесь строки обеих таблиц что-то говорят о проекте, поэтому ряд их объединения говорит что-то о проекте каждой из них. Необязательно, что, скажем, проект, участвующий с некоторыми значениями в одной таблице / взаимосвязи / ассоциации, подразумевает, что он участвует с некоторыми значениями в другой - что было бы в случае, когда выполняется FK.
@philipxy Отличный комментарий. Но тогда почему вы не опубликовали ответ, если на вопрос явно можно ответить?
Вы действительно имеете в виду, что здесь задействован только один сотрудник, и в обеих таблицах есть данные только для этого сотрудника? Что именно говорит строка, будучи ей для каждой таблицы?
@TimBiegeleisen Я раскритиковал несколько вводящих в заблуждение комментариев; Ответственность - это отдельный вопрос. Сообщение не ясно относительно "несогласованного", но, принимая очевидное значение различных проектов, за него следует отвечать, потому что результат описан в терминах просто "несогласованные" и табличные значения, а не в терминах значений таблиц. Но даже если "несогласованные" задействованы понятия приложения, таблица 2 предназначена для того же сотрудника, что и таблица 1, поэтому мы можем объединить их для получения данных по этому сотруднику. (На «что говорят входные и выходные строки» - а не ограничения.) Но я подозреваю, что спрашивающий хочет, чтобы входные данные касались многих сотрудников, поэтому я попросил ясности и минимальный воспроизводимый пример.
Попробуй это
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
Я не думаю, что это правильно. Он хочет анти-соединение, а не внешнее соединение.
@TheImpaler, вы можете предложить, как можно улучшить дизайн, а не закрывать его! Я могу модулировать table1, но не table 2
@my_way надеюсь, вы получили результат после моей модификации
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»?
Да, вы правы - должно быть перекрестное соединение. Я обновил запрос.
ВЫБЕРИТЕ 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
Прочтите справку по редактированию кода форматирования, посмотрите отформатированную версию своего ответа и нажмите «Изменить», чтобы отредактировать ее.
Это то, что вы хотите, или то, что вы получаете сейчас? Если это не желаемое, можете ли вы добавить это?