Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Комбинирайте две таблици, които нямат общи полета

Има няколко начина да направите това, в зависимост от това, което наистина искам. При липса на общи колони трябва да решите дали искате да въведете обща колона или да получите продукта.

Да приемем, че имате двете таблици:

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 не гарантира реда, в който произвежда данни, съвпадението може да се промени всеки път, когато правите заявката, освен ако нямате конкретна връзка или order by клауза.

Мисля, че идеалното нещо, което трябва да направите, би било да добавите колона към двете таблици, указваща каква е връзката. Ако няма реална връзка, тогава вероятно нямате работа да се опитвате да ги поставите рамо до рамо с SQL.

Ако просто искате да се показват един до друг в отчет или на уеб страница (два примера), правилният инструмент за това е каквото и да генерира вашия отчет или уеб страница, заедно с две независими SQL заявки, за да получите двете несвързани таблици. Например решетка с две колони в BIRT (или Crystal или Jasper), всяка с отделна таблица с данни, или HTML таблица с две колони (или CSS), всяка с отделна таблица с данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавяне на идентичност към съществуваща колона

  2. Кои колони обикновено правят добри индекси?

  3. Съхранение на файл в база данни за разлика от файловата система?

  4. Кой е най-дългият възможен телефонен номер в световен мащаб, който трябва да взема предвид в SQL varchar(дължина) за телефона

  5. Как мога да реша проблем с пула за връзки между ASP.NET и SQL Server?