Nano Hash - криптовалюты, майнинг, программирование

SQL-запрос (в SQL, реляционной алгебре и кортежном реляционном исчислении)

Я делаю тестовый экзамен, где я застрял на одном конкретном запросе, как в его коде SQL, так и в реляционной алгебре и реляционном исчислении кортежей.

В запросе говорится: Найдите пары (город, штат), в которых находится ветвь каждого типа, указанного в отношении Branch.

Где Branch:

Branch_ID (Primary key)
Branch_City
Branch_State
Branch_Type

и Город:

City_Name (Primary key)
State_Name (Primary key)
Population

А Branch_City и Branch_State являются внешними ключами для City_Name и State_Name соответственно.

"Правила" заключаются в том, что агрегатные функции, такие как COUNT,MAX и т. д., нельзя использовать.

Запрос должен быть «понятен» MySQL и PostgreSQL, однако можно использовать такие функции, как EXCEPT, INTERSECT, доступные в PostgreSQL, но не в MySQL.

Нет подзапросов в предложении FROM

Как уже говорилось, было бы весьма признательно, если бы ответы могли быть предоставлены для sQL, реляционной алгебры и реляционного исчисления кортежей. Эти вопросы остановили меня.

Заранее спасибо!


Ответы:


1
-- The query states: Find the (city,state) pairs which house a branch of every type which is listed in the Branch relation.
--                                               ((((                    ^^^^^ ^^^^    ))
-- This is equivalent to: Find cities for which "There does NOT EXIST a branchType that is NOT PRESENT in this City"
-- This leads to the double "NOT EXISTS (NOT EXISTS())" solution to relational devision.::
SELECT  * -- city,state
FROM city c
WHERE NOT EXISTS (
        -- find a branchtype that is not present in our city
        SELECT * FROM Branch b
        WHERE NOT EXISTS (
                -- same city for this  branchtype
                SELECT * FROM Branch nx
                WHERE nx.Branch_City = c.City_Name AND nx.Branch_State = c.State_Name
                AND nx.Branch_Type = b.Branch_Type
                )
        )
        ;

Реляционное деление — это термин, обозначающий этот тип операции.

Кстати: составной первичный ключ (город, штат) для таблицы city предназначен только для того, чтобы сбить вас с толку. Обычно вы используете числовой (суррогатный) city_id в качестве первичного ключа для таблицы city, а также используете его в качестве внешнего ключа в таблице branches.

23.03.2013
  • Большое спасибо! Это было чрезвычайно полезно! Наконец-то я понял, как деление реализовано в чистом SQL-программировании! 24.03.2013

  • 2

    Это синтаксис SQL Server, потому что у меня нет MySql или PostGresSQL, но он должен дать вам представление:

    with branches as (
      select * from ( values
        ('Perth',1),
        ('Toronto',1), ('Toronto',2), ('Toronto',3),
        ('Hamilton',2), ('Hamilton',3)
      ) branches(City,  Branch_Type)
    )
    
      select distinct
        City
      from branches
    except
      select distinct 
        b.City
      from branches t 
      cross join branches b 
      left join branches b2 on b2.Branch_Type = t.Branch_Type and b2.City = b.City
      where b2.Branch_Type is null
    

    Я урезал его до минимума, чтобы продемонстрировать необходимые операции с множествами.

    Верхняя половина запроса возвращает все три города; во второй половине возвращаются только Гамильтон и Перт; так что весь запрос возвращает только Торонто.

    Я не использовал ни реляционную алгебру, ни реляционное исчисление уже 30 лет, но выражение приведенного выше запроса на этих диалектах — просто упражнение по переводу.

    Обновление для MySQL:

    with branches as (
      select * from ( values
        ('Perth',1),
        ('Toronto',1), ('Toronto',2), ('Toronto',3),
        ('Hamilton',2), ('Hamilton',3)
      ) branches(City,  Branch_Type)
    )
    
    select distinct
      City
    from branches
    where City not in (
      select distinct 
        b.City
      from branches t 
      cross join branches b 
      left join branches b2 on b2.Branch_Type = t.Branch_Type and b2.City = b.City
      where b2.Branch_Type is null
      )
    

    Поскольку подзапрос находится в предложении WHERE, а не в предложении FROM, это должно быть законным. Это можно было бы выразить как левое соединение, но я думаю, что это перемещает подзапрос в предложение FROM.

    23.03.2013
  • Я уже запустил SQL Fiddle для решения этой проблемы и подтверждаю, что ваш ответ работает для SQL Server sqlfiddle.com/# !3/48e48 и PostgreSQL, но не для MySql. 23.03.2013
  • @ grahamj42: Что такое MySql, эквивалентный конструкции WITH? Нужно ли явно создавать рабочие таблицы для тестирования? Поддерживает ли MySQL операции с множествами (например, оператор EXCEPT)? 23.03.2013
  • Я думаю, что необходимо создать таблицу, это то, что SQL Fiddle может сделать для вас, отвечая на такой вопрос. 23.03.2013
  • @ grahamj42: я обновил версию, которая также должна работать в MySQL. 23.03.2013
  • Я тоже! и я сделал то же самое изменение. 23.03.2013
  • Спасибо за ваш ответ! Я предполагаю, что это просто для иллюстрации? Все еще новичок в SQL ;) У меня есть вопрос. Как происходит перекрестное соединение? Хотя ответ очень хороший! 23.03.2013
  • @GustavDanell: рассмотрите матрицу с комбинациями City, State в качестве строк и Branch_Types в качестве столбцов. Изначально таблица Branches содержит записи только для некоторых ячеек матрицы. Различное перекрестное соединение генерирует полную матрицу, из которой мы выбираем те строки, в которых отсутствуют ячейки в ветвях. 23.03.2013
  • MySQL не имеет CTE (поэтому нет доступных WITH :) 23.03.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..