PDA

View Full Version : Cần giúp về câu lệnh SELECT lồng nhau trong sql



thanhtrung_htth
09-08-2011, 20:25
Mọi người giúp tớ với!
Tớ muốn xử lý vấn đề về Cây Gia Phả:
Có Table: tb_name(Cha,Con) với dữ liệu như sau:
Cha--|--Con
1-----|----2
1-----|----3
2-----|----4
3-----|----5
4-----|----6
5-----|----7
7-----|----8

Sử dụng câu lệnh sql như thế nào để kết quả trả về của câu lệnh ta được các hàng như sau:

Hàng 1: 1 2 4 6
Hàng 2: 1 3 5 7 8
....
Hàng n: ....

Kết quả trả về của câu lệnh Sql ta sẽ biết được các thông tin như :
Ông có tên là 1 thì sẽ có những Cháu chắt chút chít nào.

trong ví dụ trên thì ông có tên là 1 có con là 2,3 có cháu là:4,5 và có chắt là 6,7...
(Không có sự can thiệp của ngôn ngữ lập trình mà chỉ sử dụng câu lệnh truy vấn sql)
Ai bít chỉ tớ với!

chip07
10-08-2011, 01:34
-- Ko bít, chỉ làm bừa thui (^_^)



CREATE TABLE tblChaCon
(
[Cha] [nvarchar](50) NOT NULL,
[Con] [nvarchar](50) NOT NULL
)
GO

INSERT tblChaCon ([Cha], [Con])
VALUES ('1','2')
, ('1','3')
, ('2','4')
, ('3','5')
, ('4','6')
, ('5','7')
, ('7','8')

GO

CREATE FUNCTION [dbo].ufnTimCha
(
@Con nvarchar(50)
)
RETURNS nvarchar(4000)
AS
BEGIN
DECLARE @PhaHe nvarchar(4000)
DECLARE @f bit

SELECT @PhaHe = @Con, @f = 1

WHILE (@f = 1)
BEGIN
DECLARE @i int

SELECT @i = CASE WHEN CHARINDEX(',',@PhaHe) = 0 THEN LEN(@PhaHe) ELSE CHARINDEX(',',@PhaHe) - 1 END

IF EXISTS (SELECT 1 FROM tblChaCon WHERE Con = LEFT(@PhaHe, @i))
SELECT @PhaHe = Cha + ',' + @PhaHe
FROM tblChaCon
WHERE Con = LEFT(@PhaHe, @i)
ELSE
SELECT @f = 0
END

RETURN @PhaHe
END
GO

SELECT [dbo].ufnTimCha(Con) PhaHe
FROM
(
SELECT cha.Con
FROM tblChaCon cha
LEFT OUTER JOIN tblChaCon con
ON (cha.Con = con.Cha)
WHERE con.Cha IS NULL
GROUP BY cha.Con
) rs

GO

DROP FUNCTION [dbo].ufnTimCha

DROP TABLE tblChaCon
GO

Van8Hien62
10-08-2011, 20:31
Sql có phải là NNLT không ? Bạn dùng sql nào ( Ms Sql, MySql, IB, Oracle, pSql, ...) dùng version nào, dùng IDE nào ?

Tham khảo bài viết cho Ms SQL : http://www.ddth.com/showthread.php/266094-de-qui-trong-ms-sql-2005.html
trong đó dùng NNLT t-SQL.

chip07
10-08-2011, 21:19
tiện đây xin trình bày quan điểm là rất phê bình các bạn lên 4rum kêu gọi giúp đỡ, rồi lại lặn mất tăm, ko một phản hồi là vấn đề các bạn đã được giải quyết hay chưa?

bongbingo
21-08-2011, 13:27
tiện đây xin trình bày quan điểm là rất phê bình các bạn lên 4rum kêu gọi giúp đỡ, rồi lại lặn mất tăm, ko một phản hồi là vấn đề các bạn đã được giải quyết hay chưa?

chính xác, nhờ người khác rùi chẳng thấy phản hồi 1 câu. nhân tiện hỏi rằng ko biết forum mình có tính năng gửi email remind khi câu hỏi mình trả lời hay ai quote hoặc reply cho mình (đề cập) như các diễn đàn của microsoft ko? nếu vậy thì sẽ làm cho mem dễ follow theo thread mình quan tâm.

spider_man88
22-08-2011, 17:09
chắc nhiều khi hỏi xong nhưng không thấy ai trả lời , rồi sau khi tìm được thì chắc lại quên mất là mình đi hỏi trên diễn đàn.

chính xác, nhờ người khác rùi chẳng thấy phản hồi 1 câu. nhân tiện hỏi rằng ko biết forum mình có tính năng gửi email remind khi câu hỏi mình trả lời hay ai quote hoặc reply cho mình (đề cập) như các diễn đàn của microsoft ko? nếu vậy thì sẽ làm cho mem dễ follow theo thread mình quan tâm.

Van8Hien62
22-08-2011, 18:14
chắc nhiều khi hỏi xong nhưng không thấy ai trả lời , rồi sau khi tìm được thì chắc lại quên mất là mình đi hỏi trên diễn đàn

Còn bạn ?

Đây là DDTH. Bạn không hỏi, cũng không trả lời cho vấn đề cho người hỏi (...)