Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Połącz dwie tabele, które nie mają wspólnych pól

Można to zrobić na kilka sposobów, w zależności od tego, co naprawdę chcieć. Bez wspólnych kolumn musisz zdecydować, czy chcesz wprowadzić wspólną kolumnę, czy otrzymać produkt.

Załóżmy, że masz dwa stoły:

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

Zapomnij o rzeczywistych kolumnach, ponieważ najprawdopodobniej masz w tym przypadku relacja klient/zamówienie/część; Właśnie użyłem tych kolumn, aby zilustrować sposoby na zrobienie tego.

Produkt kartezjański dopasuje każdy wiersz w pierwszej tabeli do każdego wiersza w drugiej:

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

Prawdopodobnie nie tego chcesz, ponieważ 1000 części i 100 klientów dałoby 100 000 wierszy z dużą ilością zduplikowanych informacji.

Alternatywnie możesz użyć unii, aby po prostu wyprowadzić dane, ale nie obok siebie (musisz upewnić się, że typy kolumn są zgodne między dwoma zaznaczeniami, albo przez zapewnienie zgodności kolumn tabeli, albo wymuszenie ich w zaznaczeniu ):

> 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

W niektórych bazach danych można użyć kolumny lub pseudokolumny rowid/rownum, aby dopasować rekordy obok siebie, na przykład:

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

Kod byłby podobny do:

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

Nadal jest jak produkt kartezjański, ale where klauzula ogranicza sposób łączenia wierszy w celu utworzenia wyników (więc tak naprawdę nie jest to iloczyn kartezjański).

Nie testowałem tego SQL, ponieważ jest to jedno z ograniczeń mojego wyboru DBMS, i słusznie, nie sądzę, aby był kiedykolwiek potrzebny w odpowiednio przemyślanym schemacie. Ponieważ SQL nie gwarantuje kolejności, w jakiej generuje dane, dopasowanie może zmieniać się za każdym razem, gdy wykonujesz zapytanie, chyba że masz konkretny związek lub order by klauzula.

Myślę, że idealnym rozwiązaniem byłoby dodanie kolumny do obu tabel, określającej, jaka jest relacja. Jeśli nie ma prawdziwej relacji, prawdopodobnie nie ma sensu łączyć ich z SQL.

Jeśli chcesz, aby były wyświetlane obok siebie w raporcie lub na stronie internetowej (dwa przykłady), właściwym narzędziem do tego jest to, co generuje raport lub stronę internetową, w połączeniu z dwoma niezależnymi Zapytania SQL w celu uzyskania dwóch niepowiązanych tabel. Na przykład dwukolumnowa siatka w BIRT (lub Crystal lub Jasper), każda z osobną tabelą danych, lub dwukolumnowa tabela HTML (lub CSS), każda z osobną tabelą danych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server — Auto-inkrementacja, która umożliwia UPDATE instrukcji

  2. Kiedy używać wspólnego wyrażenia tabelowego (CTE)

  3. Blokowanie, blokowanie, blokowanie w DBA Drzwi z blokowaniem SQL Server

  4. Uzyskaj 1 górny wiersz z każdej grupy

  5. Jak wykonać procedurę składowaną w programie C#?