Получите значения столбцов A таблицы 1 и значений столбца B таблицы 2 с тем же идентификатором

У меня есть 2 таблицы 1 и 2, я хочу запросить объединение результатов, как показано ниже.

Таблица 1

Ряд # ИДЕНТИФИКАТОР Возраст Цвет 1 1234 15 Красный 2 1234 15 Желтый 3 1235 16 Зеленый 4 1235 16 Желтый 5 1235 16 Белый 6 1235 16 Зеленый 7 1236 21 Черный 8 1236 21 Розовый

Таблица 2

Ряд # ИДЕНТИФИКАТОР Возраст Фрукты 1 1234 15 Апельсин 2 1234 15 Яблоко 3 1235 16 Банан 4 1235 16 Персик 5 1236 21 Банан 6 1236 21 Апельсин 7 1236 21 Киви

Результат запроса должен быть

Ряд # ИДЕНТИФИКАТОР Возраст Цвет Фрукты 1 1234 15 Красный Апельсин 2 1234 15 Желтый Яблоко 3 1235 16 Зеленый Банан 4 1235 16 Желтый Персик 5 1235 16 Белый Нулевой 6 1235 16 Зеленый Нулевой 7 1236 21 Черный Банан 8 1236 21 Розовый Апельсин 9 1236 21 Нулевой Киви

Это выглядит очень просто, но я не смог этого понять. Я использую базу данных SQL Server 2019 и SSMS19. Я пытался,

select t1.*, t2.Fruit
from Table_1 t1
left join Table_2 t2 on t1.ID = t2.ID

Вам не хватает одного условия присоединения left join Table_2 t2 on t1.ID = t2.ID and t1.Row# = t2.Row#

Dale K 25.06.2024 08:13

Как сказал @DaleK, или вы пропустили регистрацию на Age left join Table_2 t2 on t1.ID = t2.ID and t1.Age = t2.Age

Alan Schofield 25.06.2024 09:43

Привет, Алан, вот результат: Красный, Оранжевый; Красное яблоко; Желтый, Оранжевый; Желтый, Яблоко, Но я не хочу, чтобы Красный и Желтый повторялись. Если количество фруктов и цвет не равны, мне нужно указать нулевое значение.

Anh Hung Tran 25.06.2024 17:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы должны использовать right join, чтобы получить результат null, если связь отсутствует. Но вам следует добавить еще одну таблицу Table_1_Table_2, чтобы сделать отношение «один к одному», или добавить столбец в table_1 table_2_ROW, чтобы управлять такой структурой. И запрос

select t1.*, t2.Fruit
from Table_2 t2
right join Table_1_Table_2 t1_t2 on t1_t2.fruitRef_ROW = t2.ROW
right join Table_1 t1 on t1_t2.colorRef_ROW = t1.ROW`
Ответ принят как подходящий

На основе вашего набора данных вам необходимо создать свой собственный рейтинг в каждой группе ID/Age, чтобы вы могли объединяться между таблицами. Затем вам нужно использовать FULL JOIN, потому что вам нужны данные из любой таблицы. Следующий запрос дает желаемый результат:

DECLARE @T1 TABLE(RowID INT, ID INT, Age INT, Color VARCHAR(20));
INSERT  @T1(RowID, ID, Age, Color)
VALUES
    (1, 1234, 15, 'Red'),
    (2, 1234, 15, 'Yellow'),
    (3, 1235, 16, 'Green'),
    (4, 1235, 16, 'Yellow'),
    (5, 1235, 16, 'White'),
    (6, 1235, 16, 'Green'),
    (7, 1236, 21, 'Black'),
    (8, 1236, 21, 'Pink');

DECLARE @T2 TABLE(RowID INT, ID INT, Age INT, Fruit VARCHAR(20));
INSERT  @T2(RowID, ID, Age, Fruit)
VALUES
    (1, 1234, 15, 'Orange'),
    (2, 1234, 15, 'Apple'),
    (3, 1235, 16, 'Banana'),
    (4, 1235, 16, 'Peach'),
    (5, 1236, 21, 'Banana'),
    (6, 1236, 21, 'Orange'),
    (7, 1236, 21, 'Kiwifruit');

SELECT  RowID = ROW_NUMBER() OVER(ORDER BY ISNULL(t1.ID,t2.ID)),
        ID = ISNULL(t1.ID,t2.ID),
        Age = ISNULL(t1.Age,t2.Age),
        t1.Color,
        t2.Fruit
FROM    (   SELECT  *, RowNumber=ROW_NUMBER() OVER(PARTITION BY ID,t.Age ORDER BY t.RowID)
            FROM    @T1 AS t
        ) AS t1
        FULL JOIN 
        (   SELECT  *, RowNumber=ROW_NUMBER() OVER(PARTITION BY ID,t.Age ORDER BY t.RowID)
            FROM    @T2 AS t
        ) AS t2
            ON t2.ID = t1.ID
            AND t2.Age = t1.Age
            AND t2.RowNumber = t1.RowNumber

Приведенный ниже запрос должен дать правильный результат:

SELECT 
    COALESCE(t1.ID, t2.ID) AS ID,
    COALESCE(t1.Age, t2.Age) AS Age,
    t1.Color,
    t2.Fruit
FROM Table_1 t1
FULL OUTER JOIN Table_2 t2
ON t1.ID = t2.ID AND t1.Age = t2.Age
ORDER BY ID, Age, Color, Fruit;

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

Как выбрать следующее наименьшее значение и следующее наибольшее значение из определенного значения записи, которое было помечено?
Аутентификация ManagedIdentityCredential недоступна. Запрошенный идентификатор не был назначен этому ресурсу
Запретить SQL сопоставлять конечные пробелы и вместо этого явно сопоставлять условие
Географическая точка внутри многоугольника показывает неверные результаты
Как вы можете вычислить, является ли результат десятичным или целым числом в SQL?
Невозможно создать DbContext типа NULL. Исключение «Ссылка на объект не установлена ​​на экземпляр объекта»
Подзапрос INSERT INTO SELECT, который использует udf и возвращает 1 значение
Необработанное исключение. Microsoft.Data.SqlClient.SqlException (0x80131904)
Как поднять ошибку, если условие не соответствует
Уровень изоляции для размещения базы данных при удалении больших объемов данных?

Похожие вопросы

Как выбрать следующее наименьшее значение и следующее наибольшее значение из определенного значения записи, которое было помечено?
Хранимая процедура: добавьте параметр для месяца или часа
Как эффективно самостоятельно присоединиться к одной и той же таблице несколько раз с порядком сортировки по возрастанию и убыванию?
Запретить SQL сопоставлять конечные пробелы и вместо этого явно сопоставлять условие
Как вы можете вычислить, является ли результат десятичным или целым числом в SQL?
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ НА ДВУХ ТАБЛИЦАХ MYSQL С 3 СВЯЗАННЫМИ КОЛОННАМИ
Подзапрос INSERT INTO SELECT, который использует udf и возвращает 1 значение
Файл содержит значения даты как «01.09.2015 14:30:00». Но после импорта в таблицу oracle все значения даты отображаются как «20-01-19 15:12:15.00000 PM»
Как поднять ошибку, если условие не соответствует
Как вставить много строк тегов на основе входного массива?