sql >> Databáze >  >> RDS >> Sqlserver

Zkombinujte dvě tabulky, které nemají žádná společná pole

Existuje řada způsobů, jak toho dosáhnout, v závislosti na tom, co skutečně děláte chtít. Bez společných sloupců se musíte rozhodnout, zda chcete zavést společný sloupec nebo získat produkt.

Řekněme, že máte dvě tabulky:

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

Zapomeňte na skutečné sloupce, protože byste je s největší pravděpodobností měli v tomto případě vztah zákazník/objednávka/část; Tyto sloupce jsem právě použil k ilustraci způsobů, jak toho dosáhnout.

Kartézský součin se bude shodovat s každým řádkem v první tabulce s každým řádkem ve druhé:

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

To pravděpodobně není to, co chcete, protože 1000 dílů a 100 zákazníků by vedlo ke 100 000 řádkům se spoustou duplicitních informací.

Alternativně můžete použít sjednocení pouze k výstupu dat, i když ne vedle sebe (musíte se ujistit, že typy sloupců jsou kompatibilní mezi dvěma výběry, buď tím, že sloupce tabulky budou kompatibilní, nebo je vynucete ve výběru ):

> 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

V některých databázích můžete použít sloupec rowid/rownum nebo pseudosloupec k přiřazování záznamů vedle sebe, například:

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

Kód by byl něco jako:

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

Je to stále jako kartézský součin, ale where klauzule omezuje, jak jsou řádky kombinovány, aby vytvořily výsledky (takže vůbec nejde o kartézský součin, opravdu).

Netestoval jsem to SQL, protože je to jedno z omezení mého výběru DBMS, a právem nevěřím, že by to bylo někdy potřeba ve správně promyšleném schématu. Vzhledem k tomu, že SQL nezaručuje pořadí, ve kterém vytváří data, shoda se může změnit pokaždé, když provedete dotaz, pokud nemáte konkrétní vztah nebo order by doložka.

Myslím, že ideální by bylo přidat do obou tabulek sloupec s uvedením, jaký je vztah. Pokud neexistuje žádný skutečný vztah, pak pravděpodobně nemáte co dělat v tom, abyste je postavili vedle SQL.

Pokud je chcete zobrazit vedle sebe v přehledu nebo na webové stránce (dva příklady), správným nástrojem je to, co vygeneruje vaši sestavu nebo webovou stránku, spolu se dvěma nezávislými SQL dotazy k získání dvou nesouvisejících tabulek. Například dvousloupcová mřížka v BIRT (nebo Crystal nebo Jasper), každá se samostatnou datovou tabulkou, nebo HTML dvousloupcová tabulka (nebo CSS), každá se samostatnou datovou tabulkou.



  1. Jak otestovat můj ad-hoc SQL s parametry v okně dotazu Postgres

  2. Převést „datetimeoffset“ na „date“ v SQL Server (příklady T-SQL)

  3. Postgres - poslední verze 0.14.0 drahokamu pg hlásí chybu

  4. izolování dílčího řetězce v řetězci před symbolem v SQL Server 2008