Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm phẳng XML phân cấp trong SQL bằng phương thức node ()

Dường như tôi đã trả lời được câu hỏi của chính mình sau khi tìm hiểu kỹ hơn một chút trên mạng:

SELECT
    grandparent.gname.value('@name', 'VARCHAR(15)'),
    parent.pname.value('@name', 'VARCHAR(15)'),
    child.cname.value('@name', 'VARCHAR(15)')
FROM
    @xmlFamilyTree.nodes('/grandparent') AS grandparent(gname)
CROSS APPLY
    grandparent.gname.nodes('*') AS parent(pname)
CROSS APPLY
    parent.pname.nodes('children/*') AS child(cname)

Sử dụng CROSS APPLY Tôi có thể chọn grandparent cấp cao nhất và sử dụng nút này để chọn parent con các nút và như vậy. Sử dụng phương pháp này, tôi đã thực hiện truy vấn trong khoảng 1 phút 30 giây xuống khoảng 6 giây .

Tuy nhiên, điều thú vị là nếu tôi sử dụng OPEN XML "cũ" để truy xuất cùng một dữ liệu, truy vấn thực thi sau 1 giây !

Có vẻ như bạn có thể phải tiếp cận việc sử dụng hai kỹ thuật này trong từng trường hợp cụ thể tùy thuộc vào kích thước / độ phức tạp dự kiến ​​của tài liệu được chuyển vào.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python không thể tìm thấy Trình điều khiển ODBC trên Heroku sau khi thiết lập mọi thứ

  2. Cách xóa các bản ghi KHÔNG VÀO

  3. Sử dụng FILEGROUP_ID () để trả về ID của nhóm tệp trong SQL Server

  4. Làm cách nào để thực thi .sql từ C #?

  5. Cách lấy số đúng / sai từ một trường bit thành hai cột riêng biệt