Работали ли вы с RIGHT JOIN?

Ответ

Да, работал. RIGHT JOIN в SQL возвращает все записи из правой таблицы и соответствующие записи из левой. Если соответствия нет, результат для левой таблицы будет NULL.

В Go при работе с SQL можно использовать RIGHT JOIN через стандартный пакет database/sql:

rows, err := db.Query(`
    SELECT u.name, o.order_id 
    FROM users u
    RIGHT JOIN orders o ON u.id = o.user_id
`)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
    var name sql.NullString
    var orderID string
    if err := rows.Scan(&name, &orderID); err != nil {
        log.Fatal(err)
    }
    // Обработка данных
    // Пример: fmt.Printf("Order ID: %s, User Name: %sn", orderID, name.String)
}

Особенности использования в Go:

  • Обработка NULL: В Go необходимо учитывать NULL значения, используя специальные типы, такие как sql.NullString, sql.NullInt64, sql.NullBool, sql.NullTime и т.д. Это позволяет корректно обрабатывать случаи, когда в левой таблице нет соответствующей записи.
  • Частота использования: RIGHT JOIN используется реже, чем LEFT JOIN, так как большинство запросов строятся вокруг основной (левой) таблицы.
  • ORM: В некоторых ORM (например, GORM) RIGHT JOIN может не поддерживаться напрямую через высокоуровневые методы и может потребовать использования сырых SQL-запросов (Raw()).

Ответ 18+ 🔞

А, ну ты про RIGHT JOIN спрашиваешь! Да, работал, конечно, с этой штукой. Понимаешь, это как LEFT JOIN, только наоборот, ёпта. Представь: есть у тебя две таблицы — одна левая, другая правая. Так вот, RIGHT JOIN тебе вывалит всё из правой таблицы, и если к этому в левой что-то приклеилось — хорошо, а если нет — так и запишем: NULL, нихуя, пустота.

Вот смотри, на Go это выглядит примерно так, если через стандартный database/sql пинать:

rows, err := db.Query(`
    SELECT u.name, o.order_id 
    FROM users u
    RIGHT JOIN orders o ON u.id = o.user_id
`)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
    var name sql.NullString
    var orderID string
    if err := rows.Scan(&name, &orderID); err != nil {
        log.Fatal(err)
    }
    // Обработка данных
    // Пример: fmt.Printf("Order ID: %s, User Name: %sn", orderID, name.String)
}

А теперь, блядь, главные подводные камни, чтобы ты не обосрался на ровном месте:

  • NULL — твой новый кошмар. В Go нихуя не любят NULL из базы. Поэтому, если в левой таблице записи не нашлось, тебе придётся юзать специальные типы вроде sql.NullString, sql.NullInt64 и прочие sql.NullЧтоТоТам. Иначе получишь пиздец, а не данные.
  • Используют его редко, как говна за баней. Честно. Все обычно строят запросы вокруг главной (левой) таблицы, поэтому LEFT JOIN — царь и бог, а RIGHT JOIN — этакий полупидор, которого все стесняются. Но он есть!
  • С ORM'ами может быть засада. Возьмём, к примеру, GORM. Там эта мартышлюшка может и не дать тебе RIGHT JOIN через свои красивые методы. Придётся, сука, сырой SQL вставлять через Raw(), как в старые добрые времена. Вот так вот, нахуй.

Короче, инструмент есть, но перед применением думай, блядь, головой — точно ли он тут нужен, или можно переписать запрос с LEFT JOIN, чтобы не путать потом всех, включая себя самого.