Saya memiliki grafik dengan node {A, B, C, D, ...} dan tabel yang menentukan tepi yang diarahkan di antara mereka.

| node_1 | node_2 |
|-----------------|
|      A | B      |
|      A | C      |
|      B | A      |
|      B | D      |
|      D | A      |

Kami menulis A ~ B Jika ada tepi dari A ke B. Jadi baris di mana node_1 = A dan node_2 = B menyiratkan A ~ B. Saya membedakan antara jenis hubungan berikut:

A = B if A ~ B and B ~ A
A > B if A ~ B and not B ~ A
A < B if B ~ A and not A ~ B

Bagaimana saya bisa mengambil semua node yang berdekatan dengan node yang diberikan bersama dengan jenis hubungan mereka? Misalnya, kueri untuk A pada tabel di atas harus kembali

| node | type |
|------|------|
|    B | =    | (because A ~ B and B ~ A)
|    C | >    | (because A ~ C and not C ~ A)
|    D | <    | (because D ~ A and not A ~ D)
 
sql
1
2c8pnxpfq3 29 Mei 2021, 02:48

2 jawaban

Jawaban Terbaik

Ini salah satu cara:

select 
 node, 
 case when count(*) = 2 then '=' 
 when max(ordertype) = 1 then '>'
 when max(ordertype) = 2 then '<'
 end as type
from (
select node2 node,1 ordertype from nodes 
where node1 = 'A'
union all 
select node1,2 from nodes 
where node2 = 'A'
) t 
group by node 
order by node 
1
eshirvana 28 Mei 2021, 23:58

Hmmm . . . Anda dapat menggunakan logika bersyarat dengan agregasi:

select (case when node_1 = 'A' then node_2 else node_1 end) as other_node,
       (case when count(*) = 2 then '='
             when max(node_1) = 'A' then '>'
             else '<'
        end) as type
from nodes n
where 'A' in (node_1, node_2)
group by (case when node_1 = 'A' then node_2 else node_1 end);

di sini

Ini sepertinya paling sederhana dan mungkin solusi paling berkinerja.

1
Gordon Linoff 29 Mei 2021, 00:18