PostgreSQL/Table Joins/CROSS JOIN

Материал из SQL эксперт
Перейти к: навигация, поиск

A simple CROSS JOIN

postgres=#
postgres=#
postgres=# CREATE TABLE "books" (
postgres(#      "id"           integer NOT NULL,
postgres(#      "title"        text NOT NULL,
postgres(#      "author_id"    integer,
postgres(#      "subject_id"   integer,
postgres(#      Constraint "books_id_pkey" Primary Key ("id")
postgres(# );
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "books_id_pkey" for table "books"
CREATE TABLE
postgres=#
postgres=#
postgres=# insert into books values (7808,  "Java",                  4156, 9);
INSERT 0 1
postgres=# insert into books values (4513,  "Javascript",            1866, 15);
INSERT 0 1
postgres=# insert into books values (4267,  "C#",                    2001, 15);
INSERT 0 1
postgres=# insert into books values (1608,  "Oracle",                1809, 2);
INSERT 0 1
postgres=# insert into books values (1590,  "Sql Server",            1809, 2);
INSERT 0 1
postgres=# insert into books values (25908, "Postgre SQL",          15990, 2);
INSERT 0 1
postgres=# insert into books values (1501,  "Python",                2031, 2);
INSERT 0 1
postgres=# insert into books values (190,   "Java by API",             16, 6);
INSERT 0 1
postgres=# insert into books values (1234,  "2D",                   25041, 3);
INSERT 0 1
postgres=# insert into books values (2038,  "C",                     1644, 0);
INSERT 0 1
postgres=# insert into books values (156,   "C++",                    115, 9);
INSERT 0 1
postgres=# insert into books values (41473, "Programming Python",    7805, 4);
INSERT 0 1
postgres=# insert into books values (41477, "Learning Python",       7805, 4);
INSERT 0 1
postgres=# insert into books values (41478, "Perl Cookbook",         7806, 4);
INSERT 0 1
postgres=# insert into books values (41472, "Practical PostgreSQL",  1212, 4);
INSERT 0 1
postgres=#
postgres=# select * from books;
  id   |        title         | author_id | subject_id
-------+----------------------+-----------+------------
  7808 | Java                 |      4156 |          9
  4513 | Javascript           |      1866 |         15
  4267 | C#                   |      2001 |         15
  1608 | Oracle               |      1809 |          2
  1590 | Sql Server           |      1809 |          2
 25908 | Postgre SQL          |     15990 |          2
  1501 | Python               |      2031 |          2
   190 | Java by API          |        16 |          6
  1234 | 2D                   |     25041 |          3
  2038 | C                    |      1644 |          0
   156 | C++                  |       115 |          9
 41473 | Programming Python   |      7805 |          4
 41477 | Learning Python      |      7805 |          4
 41478 | Perl Cookbook        |      7806 |          4
 41472 | Practical PostgreSQL |      1212 |          4
(15 rows)
postgres=#
postgres=# CREATE TABLE "authors" (
postgres(#      "id" integer NOT NULL,
postgres(#      "last_name" text,
postgres(#      "first_name" text,
postgres(#      Constraint "authors_pkey" Primary Key ("id")
postgres(# );
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "authors_pkey" for table "authors"
CREATE TABLE
postgres=#
postgres=#
postgres=# insert into authors values (1111,  "Martin",       "Jason");
INSERT 0 1
postgres=# insert into authors values (1212,  "Worsley",      "Robert");
INSERT 0 1
postgres=# insert into authors values (15990, "Mathews",      "John");
INSERT 0 1
postgres=# insert into authors values (25041, "Smith",       "Williams");
INSERT 0 1
postgres=# insert into authors values (16,    "Alcott",       "May");
INSERT 0 1
postgres=# insert into authors values (4156,  "King",         "Stephen");
INSERT 0 1
postgres=# insert into authors values (1866,  "Herbert",      "Margaret");
INSERT 0 1
postgres=# insert into authors values (1644,  "Hogarth",      "Celia");
INSERT 0 1
postgres=# insert into authors values (2031,  "Brown",        "Wise");
INSERT 0 1
postgres=# insert into authors values (115,   "Poe",          "Allen");
INSERT 0 1
postgres=# insert into authors values (7805,  "Lutz",         "Mark");
INSERT 0 1
postgres=# insert into authors values (7806,  "Rice",         "Tom");
INSERT 0 1
postgres=# insert into authors values (1533,  "Black",        "Chris");
INSERT 0 1
postgres=# insert into authors values (1717,  "Brite",        "Linda");
INSERT 0 1
postgres=# insert into authors values (2112,  "Larry",        "Edward");
INSERT 0 1
postgres=# insert into authors values (2001,  "Clarke",       "Alison");
INSERT 0 1
postgres=# insert into authors values (1213,  "Green",        "Mary");
INSERT 0 1
postgres=#
postgres=# select * from authors;
  id   | last_name | first_name
-------+-----------+------------
  1111 | Martin    | Jason
  1212 | Worsley   | Robert
 15990 | Mathews   | John
 25041 | Smith     | Williams
    16 | Alcott    | May
  4156 | King      | Stephen
  1866 | Herbert   | Margaret
  1644 | Hogarth   | Celia
  2031 | Brown     | Wise
   115 | Poe       | Allen
  7805 | Lutz      | Mark
  7806 | Rice      | Tom
  1533 | Black     | Chris
  1717 | Brite     | Linda
  2112 | Larry     | Edward
  2001 | Clarke    | Alison
  1213 | Green     | Mary
(17 rows)
postgres=#
postgres=#
postgres=# -- A simple CROSS JOIN
postgres=#
postgres=# SELECT b.id, title, a.id, last_name
postgres-#         FROM books AS b CROSS JOIN authors AS a
postgres-#         WHERE b.author_id = a.id;
  id   |        title         |  id   | last_name
-------+----------------------+-------+-----------
  7808 | Java                 |  4156 | King
  4513 | Javascript           |  1866 | Herbert
  4267 | C#                   |  2001 | Clarke
 25908 | Postgre SQL          | 15990 | Mathews
  1501 | Python               |  2031 | Brown
   190 | Java by API          |    16 | Alcott
  1234 | 2D                   | 25041 | Smith
  2038 | C                    |  1644 | Hogarth
   156 | C++                  |   115 | Poe
 41473 | Programming Python   |  7805 | Lutz
 41477 | Learning Python      |  7805 | Lutz
 41478 | Perl Cookbook        |  7806 | Rice
 41472 | Practical PostgreSQL |  1212 | Worsley
(13 rows)
postgres=#
postgres=#
postgres=#
postgres=# drop table authors;
DROP TABLE
postgres=# drop table books;
DROP TABLE
postgres=#
postgres=#



CROSS JOIN in action

postgres=#
postgres=# CREATE TABLE t1 (
postgres(#     num         int,
postgres(#     name       varchar(10)
postgres(# );
CREATE TABLE
postgres=#
postgres=# insert into t1 values(1,"a");
INSERT 0 1
postgres=# insert into t1 values(2,"b");
INSERT 0 1
postgres=# insert into t1 values(3,"c");
INSERT 0 1
postgres=#
postgres=# CREATE TABLE t2 (
postgres(#     num         int,
postgres(#     name       varchar(10)
postgres(# );
CREATE TABLE
postgres=#
postgres=# insert into t1 values(1,"xxx");
INSERT 0 1
postgres=# insert into t1 values(3,"yyy");
INSERT 0 1
postgres=# insert into t1 values(5,"zzz");
INSERT 0 1
postgres=#
postgres=# SELECT * FROM t1 CROSS JOIN t2;
 num | name | num | name
-----+------+-----+------
(0 rows)
postgres=#
postgres=#
postgres=# drop table t1;
DROP TABLE
postgres=# drop table t2;
DROP TABLE
postgres=#
postgres=#