Làm thế nào để tham gia vào cùng một bảng nhiều lần?


9

Tôi có hai bảng, "hVELy_table" và "name_table".

Bảng phân cấp chứa một đối tượng có nhiều cha mẹ và con cái. Mỗi phụ huynh và trẻ em được tham chiếu bởi id.

|  object_id  |  parent_id_1  |  parent_id_2  |  child_id_1  |  child_id_2  |
-----------------------------------------------------------------------------
|     1234    |      9999     |      9567     |     5555     |     5556     |
-----------------------------------------------------------------------------

Mỗi id đối tượng trong hVELy_table có một mục trong name_table:

|  name_id  |    name    |
--------------------------
|   1234    |   ABCD     |
--------------------------
|   9999    |   ZYXW     |
--------------------------
| ...

Làm cách nào để tôi tham gia mỗi id trong hVELy_table vào name_table nhiều lần để tôi có thể có kết quả trong đó mọi tên được điền?

Như thế này:

|   object    |   parent_1    |   parent_2    |   child_1    |   child_2    |
-----------------------------------------------------------------------------
|     ABCD    |      ZYXW     |      BBBB     |     CCCC     |     DDDD     |
-----------------------------------------------------------------------------

Lưu ý: tên bảng trong ví dụ chỉ để rõ ràng / đơn giản, tên thật có tên riêng.

Câu trả lời:


11

hierarchy_table5 cột tham chiếu tất cả name_table, vì vậy bạn cần 5 tham gia. Có thể tốt hơn khi sử dụng các phép LEFTnối thay vì INNER, trong trường hợp một số cột này là null và bạn vẫn muốn các hàng được trả về:

SELECT 
    o.name  AS object, 
    p1.name AS parent_1, 
    p2.name AS parent_2, 
    c1.name AS child_1,  
    c2.name AS child_2 
FROM 
    hierarchy_table AS h
  LEFT JOIN name_table AS o   ON h.object_id   = o.name_id
  LEFT JOIN name_table AS p1  ON h.parent_id_1 = p1.name_id  
  LEFT JOIN name_table AS p2  ON h.parent_id_2 = p2.name_id
  LEFT JOIN name_table AS c1  ON h.child_id_1  = c1.name_id 
  LEFT JOIN name_table AS c2  ON h.child_id_2  = c2.name_id ;

Có, vì vậy các cột là nullable, vì vậy tôi cần tham gia bên trái. Cảm ơn bạn.
jase81

Vì một số lý do, tôi chỉ không nắm bắt được răng cưa cho đến khi có câu trả lời này. Có thể đáng lưu ý rằng điều này sẽ không hoạt động trong MS Access (có thể là những người khác). Tôi đã cố gắng làm một cái gì đó rất giống nhau và tôi liên tục nhận được một lỗi cú pháp. Truy cập yêu cầu lồng các Joins với ().
doubleJ

@doubleJ có, Access nổi tiếng với nhu cầu thêm dấu ngoặc đơn bất cứ khi nào có nhiều hơn 1 tham gia trong FROM.
ypercubeᵀᴹ

3

Bạn có thể sử dụng tên bí danh cho các bảng liên quan đến truy vấn.

select b.name object, c.name parent_1, d.name parent_2 
from hierarchy_table a, name_table b, name_table c, name_table d
where a.object_id = b.name_id 
  and a.parent_id_1 = c.name_id 
  and a.parent_id_2 = d.name_id

2
Tốt hơn hết là bạn không nên sử dụng kiểu cũ (nghĩa là cũ hơn 20 năm). Cú pháp ANSI dễ đọc hơn và ít bị lỗi hơn.
dezso

0

TL & DR: Nên sử dụng bí danh khi bạn muốn tham gia vào cùng một bảng nhiều lần

Hợp lý:

Trong Postgres, thông thường mọi người tham gia một cột trong một bảng này sang một cột khác trong một bảng khác. Điều này là tuyệt vời từ quan điểm thiết kế như trường hợp sử dụng bình thường. Khi bạn muốn tham gia các cột bổ sung, bạn sẽ cần sử dụng bí danh (cách thực hành tốt nhất).

LÀM THẾ NÀO ĐỂ:

Khi thực hiện INNER THAM GIA, hãy đảm bảo thêm mệnh đề AS cùng với tên.

Thí dụ

INNER JOIN ipaddresses as child_address ON ipaddress_relations.ipaddress_id = child_address.ipaddressid

Nếu bạn nhận thấy câu trả lời 'được chấp nhận' thực hiện điều này ở trên.

SELECT 
    o.name  AS object, 
    p1.name AS parent_1, 
    p2.name AS parent_2, 
    c1.name AS child_1,  
    c2.name AS child_2 
FROM 
    hierarchy_table AS h
  LEFT JOIN name_table AS o   ON h.object_id   = o.name_id
  LEFT JOIN name_table AS p1  ON h.parent_id_1 = p1.name_id  
  LEFT JOIN name_table AS p2  ON h.parent_id_2 = p2.name_id
  LEFT JOIN name_table AS c1  ON h.child_id_1  = c1.name_id 
  LEFT JOIN name_table AS c2  ON h.child_id_2  = c2.name_id ;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.