Объедините две таблицы, которые не имеют никаких общих полей

Я хочу изучить, как объединить две таблицы базы данных, у которых не есть общие поля. Я проверил ОБЪЕДИНЕНИЕ, но MSDN заявляет:

Следующее является основными правилами для объединения наборов результатов двух запросов при помощи ОБЪЕДИНЕНИЯ:

  1. Число и порядок столбцов должны быть тем же во всех запросах.
  2. Типы данных должны быть совместимыми.

Но у меня не есть поля, общие вообще. Все, что я хочу, должно объединить их в одной таблице как представление.

Таким образом, что я должен сделать?

56
задан Gary 23 August 2019 в 19:34
поделиться

5 ответов

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

Допустим, у вас есть две таблицы:

parts:              custs:
+----+----------+   +-----+------+
| id | desc     |   |  id | name |
+----+----------+   +-----+------+
|  1 | Sprocket |   | 100 | Bob  |
|  2 | Flange   |   | 101 | Paul |
+----+----------+   +-----+------+

Забудьте о фактических столбцах, так как вы, скорее всего, в данном случае отношения покупатель / заказ / деталь; Я просто использовал эти столбцы, чтобы проиллюстрировать, как это сделать.

Декартово произведение будет соответствовать каждой строке в первой таблице с каждой строкой во второй:

> select * from parts, custs;
      id desc     id  name
      -- ----     --- ----
      1  Sprocket 101 Bob
      1  Sprocket 102 Paul
      2  Flange   101 Bob
      2  Flange   102 Paul

Это, вероятно, не то, что вам нужно, поскольку 1000 частей и 100 заказчики получат 100 000 строк с большим количеством дублированной информации.

В качестве альтернативы, вы можете использовать объединение, чтобы просто выводить данные, но не бок о бок (вы ' Мне нужно убедиться, что типы столбцов совместимы между двумя выбранными объектами, либо сделав столбцы таблицы совместимыми, либо принудительно их при выборе):

> select id as pid, desc, null as cid, null as name from parts
  union
  select null as pid, null as desc, id as cid, name from custs;
    pid desc     cid name
    --- ----     --- ----
                 101 Bob 
                 102 Paul
    1   Sprocket
    2   Flange

В некоторых базах данных вы можете использовать столбец rowid / rownum или псевдостолбец для сопоставления записи рядом, например:

id desc     id  name
-- ----     --- ----
1  Sprocket 101 Bob
2  Flange   101 Bob

Код будет примерно таким:

select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;

Это все еще как декартово произведение, но предложение where ограничивает порядок строк вместе для формирования результатов (на самом деле это не декартово произведение).

Я не тестировал этот SQL для этого, поскольку это одно из ограничений моей выбранной СУБД, и это правильно, я не верю это когда-либо было необходимо в правильно продуманной схеме. Поскольку SQL не гарантирует порядок, в котором он производит данные, соответствие может меняться каждый раз, когда вы выполняете запрос, если только у вас нет конкретного отношения или упорядочить по предложению .

Я думаю, что идеальным вариантом было бы добавить столбец в обе таблицы, указывающие, каковы отношения. Если реальной взаимосвязи нет, то вам, вероятно, не стоит пытаться разместить их бок о бок с SQL.

Если вы просто хотите, чтобы они отображались бок о бок в отчете или на веб-странице (два примера ), правильный инструмент для этого - это то, что генерирует ваш отчет или веб-страницу, в сочетании с двумя независимыми SQL-запросами для получения двух несвязанных таблиц. Например, сетка из двух столбцов в BIRT (или Crystal или Jasper), каждая с отдельной таблицей данных, или таблица из двух столбцов HTML (или CSS), каждая с отдельной таблицей данных.

Я думаю, что идеальным вариантом было бы добавить столбец к обеим таблицам, определяющий, каковы отношения. Если реальной взаимосвязи нет, то вам, вероятно, не стоит пытаться разместить их рядом с SQL.

Если вы просто хотите, чтобы они отображались бок о бок в отчете или на веб-странице (два примера ), правильный инструмент для этого - это то, что генерирует ваш отчет или веб-страницу, в сочетании с двумя независимыми SQL-запросами для получения двух несвязанных таблиц. Например, сетка из двух столбцов в BIRT (или Crystal или Jasper), каждая с отдельной таблицей данных, или таблица из двух столбцов HTML (или CSS), каждая с отдельной таблицей данных.

Я думаю, что идеальным вариантом было бы добавить столбец к обеим таблицам, определяющий, каковы отношения. Если реальной взаимосвязи нет, то вам, вероятно, не стоит пытаться разместить их бок о бок с SQL.

Если вы просто хотите, чтобы они отображались бок о бок в отчете или на веб-странице (два примера ), правильный инструмент для этого - это то, что генерирует ваш отчет или веб-страницу, в сочетании с двумя независимыми SQL-запросами для получения двух несвязанных таблиц. Например, сетка из двух столбцов в BIRT (или Crystal или Jasper), каждая с отдельной таблицей данных, или таблица из двух столбцов HTML (или CSS), каждая с отдельной таблицей данных.

Если вы просто хотите, чтобы они отображались рядом в отчете или на веб-странице (два примера), правильный инструмент для этого - то, что генерирует ваш отчет или веб-страницу, в сочетании с двумя независимыми SQL-запросы для получения двух несвязанных таблиц. Например, сетка из двух столбцов в BIRT (или Crystal или Jasper), каждая с отдельной таблицей данных, или таблица из двух столбцов HTML (или CSS), каждая с отдельной таблицей данных.

Если вы просто хотите, чтобы они отображались рядом в отчете или на веб-странице (два примера), правильный инструмент для этого - то, что генерирует ваш отчет или веб-страницу, в сочетании с двумя независимыми SQL-запросы для получения двух несвязанных таблиц. Например, сетка из двух столбцов в BIRT (или Crystal или Jasper), каждая с отдельной таблицей данных, или таблица из двух столбцов HTML (или CSS), каждая с отдельной таблицей данных.

114
ответ дан 26 November 2019 в 17:05
поделиться

Чтобы получить осмысленное / полезное представление о двух таблицах, вам обычно необходимо определить поле идентификации из каждой таблицы, которое затем можно использовать в предложении ON в JOIN.

Затем на ваш взгляд:

SELECT T1.*, T2.* FROM T1 JOIN T2 ON T1.IDFIELD1 = T2.IDFIELD2

Вы упомянули, что поля не являются «общими», но хотя идентифицирующие поля могут иметь разные имена или даже не один и тот же тип данных, вы можете использовать функции convert / cast, чтобы объединить их каким-то образом.

2
ответ дан 26 November 2019 в 17:05
поделиться

Это очень странный запрос, и почти наверняка то, что вы никогда не захотите делать в реальном приложении, но с чисто академической точки зрения это интересная задача. В SQL Server 2005 вы можете использовать общие табличные выражения и функции row_number () и присоединиться к этому:

with OrderedFoos as (
    select row_number() over (order by FooName) RowNum, *
    from Foos (nolock)
),
OrderedBars as (
    select row_number() over (order by BarName) RowNum, *
    from Bars (nolock)
)
select * 
from OrderedFoos f
    full outer join OrderedBars u on u.RowNum = f.RowNum

Это работает, но это в высшей степени глупо, и я предлагаю его только как ответ «вики сообщества», потому что я действительно не рекомендую это.

24
ответ дан 26 November 2019 в 17:05
поделиться

Если в таблицах нет общих полей, то нет способа объединить данные в каком-либо значимом представлении. Скорее всего, вы получите представление, содержащее дублированные данные из обеих таблиц.

3
ответ дан 26 November 2019 в 17:05
поделиться
SELECT *
FROM table1, table2

Это объединит каждую строку в таблице 1 с таблицей 2 (декартово произведение), возвращая все столбцы.

11
ответ дан 26 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

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