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

Объединение нескольких таблиц с отношением один ко многим

У меня 3 таблицы:

maintable(id, serialno, col3, col4, col5, ..., col10)

table1(t1_id, serialno, t1_type, t1_color)

table2(t2_id, serialno, t2_base, t2_price)

Первичный ключ maintable - id, а серийный номер - UNIQUE. Первичный ключ Table1 - t1_id, а table2 - t2_id. Table1 и Table2 serialno - это внешние ключи, которые ссылаются на серийный номер MainTable.

maintable имеет отношение "один ко многим" как с table1, так и с table2.

Я хочу объединить эти 3 таблицы в DataTable.

Сначала я подумал, что это будет просто, и попробовал: «ВЫБРАТЬ * ИЗ maintable INNER JOIN table1 ON maintable.serialno = table1.serialno INNER JOIN table2 ON maintable.serialno = table2.serialno WHERE maintable.id = 200»;

Проблема с результатом заключается в том, что если table1 имеет 3 строки, а table2 имеет 4 строки, тогда мой DataTable становится 12 строк (3x4). В этом случае я хочу просто получить 4 строки.

Столбцы table1 и table2 не имеют ничего общего друг с другом, и они должны соответствовать только серийному номеру maintable.

В случае, если меня не понимают, я хочу выбрать строки table1 и table2, которые соответствуют серийному номеру maintable, и добавить их справа от maintable, чтобы они не дублировались.

Изменить: Извините, в некоторых случаях я написал accountno вместо serialno.

23.01.2015

  • Подождите, в maintable 3 строки с maintable.id = 200. И table2 имеет 4 строки, соответствующие этим 3 строкам maintable. Как вы хотите извлечь данные из получаемых строк размером 3 x 4 = 12? 23.01.2015
  • В maintable есть только 1 строка с maintable.id = 200. Table1 имеет 3 строки, которые соответствуют serialno, а Table2 - 4. Что я в конечном итоге хочу сделать, так это отобразить столбцы table1, которые соответствуют serialno, и то же самое для table2. Table1 и Table2 не имеют между собой нужных мне отношений. Я мог бы сделать это в отдельных SQL-запросах, но я пытаюсь сделать это в одном большом DataTable, потому что у меня будет еще 3 или 4 таблицы, похожие на table1 и table2. Не знаю, возможно ли это вообще. 23.01.2015
  • Как вы хотите получить 4 строки, когда table1 имеет 3, table2 имеет 4 строки и получать данные из обеих таблиц? Будет не меньше 7 рядов 23.01.2015
  • 7 рядов подойдет. Теперь у меня 12, что означает, что строки умножаются, и когда я добавляю больше таблиц, DataTable станет действительно большим. Если строки просто добавлены, проблем нет. 23.01.2015
  • Если оба столбца таблицы одинаковы, это можно сделать с помощью объединения. Теперь вам нужно 2 отдельных выбора 23.01.2015
  • @Reniuz Спасибо. Может быть, это единственный способ сделать это в конце концов. 23.01.2015

Ответы:


1
SELECT * FROM
maintable m
INNER JOIN (
SELECT t1.serialno, t1.t1_type, t1.t1_color, null as t2_base, null as t2_price
FROM table1 t1
UNION 
SELECT t2.serialno, null as t1_type, null as t1_color, t2.t2_base, t2.t2_price
FROM table2 t2
) t ON m.serialno = t.serialno
ORDER BY m.serialno

Это сделает то, о чем вы просите: вернет количество строк в t1 + количество строк в t2, а не строк в t1 x количество строк в t2. Fiddle. Это может не работать так быстро, если у вас большой объем данных.

Теперь, когда вы знаете, как это делается, не делайте этого.

Настоящий вопрос: почему это требование? Чего вы на самом деле пытаетесь здесь достичь? Это нецелесообразный способ объединения данных из двух дочерних таблиц, учитывая их взаимосвязь. T1 и t2 - это разные таблицы, и они не связаны друг с другом по какой-то причине: они не предназначены для такого объединения своих данных.

Единственные новые данные, которые я могу представить для извлечения из этого типа запроса, - это общее количество строк как в t1, так и в t2 для данного серийного номера. Но есть гораздо способы получить эту информацию лучше, чем выбор таких строк. Если вам нужны данные как t1, так и t2, а дубликаты сбивают вас с толку, велика вероятность, что вам следует сделать два отдельных оператора SELECT вместо того, чтобы пытаться объединить все.

23.01.2015
  • Это именно то, что я хотел. 23.01.2015
  • В конечном итоге я хочу сделать, как я сказал, иметь 6-7 таблиц, которые все ссылаются на один ключ в основной таблице (серийно) и отображать свои столбцы на странице. Я пытаюсь найти лучший способ сделать это, и я решил, что вместо того, чтобы выполнять запрос sql select для каждой таблицы, лучшим способом было бы объединить их все в одну большую DataTable, а затем получить оттуда нужные мне записи. Если это не оптимальное решение, пожалуйста, наставьте меня в правильном направлении. Спасибо! 23.01.2015
  • @ user4483037 Правильный способ сделать это - использовать отдельные операторы выбора для каждой таблицы SQL, создать свой список объектов в приложении и заполнить их свойства данными из различных запросов SQL. Ваше приложение может сделать это намного более эффективно, чем база данных может объединить все таблицы в один запрос SQL. Когда я говорю, что работа с большими наборами данных может не работать так быстро, это на самом деле означает, что он проиграет гонку против улитки, бегущей назад в производственной среде. 26.01.2015

  • 2
  • Исходный запрос имеет select *, то есть все столбцы из всех 3 таблиц. 23.01.2015
  • если вы хотите получить каждый столбец, то как вы ожидаете, что он вернет только 4 строки (если вы не хотите использовать агрегат)? 23.01.2015
  • Новые материалы

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

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

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

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

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

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

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