Announcement

Collapse
No announcement yet.

Mong các Pro UIT giúp em cái PHÉP CHIA TRONG SQL dùng not exist

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts
    11520410
    Hồ Nhật Tiến

  • 11520410
    replied
    mình tìm dc cách này thấy nó cũng dễ hiểu
    thứ 1: phép chia gồm có số bị chia,số chia,và thương
    đê bài yêu cầu:
    tìm *** chính là bảng thương
    tất cả *** bảng số bị chia
    và bảng liên kết 2 bảng trên lại là bảng số chia
    ta theo công thức
    select ycdb
    from bảng thương
    where not exists (
    select *
    from bảng số bị chia
    where not exist (
    select*
    from bảng số chia
    where điều kiện kết giữa các bảng trên
    )))
    chú ý...nếu đề thêm yêu cầu chọn ở bảng nào thì ở phần where bảng đó thêm điều kiện ví dụ where ncsx='VN'and not exists....

    Leave a comment:

  • 11520246
    Huỳnh Trọng Nghĩa

  • 11520246
    replied
    Originally posted by 11520104 View Post
    àh! mình thấy là phép chia dùng not exists lúc nào cũng có 3 bảng! vd bài đầu tiên của chủ thớt! có 3 bảng là HOADON, CTHD và SANPHAM! còn cái bài tập cô đưa cho mình về làm, chỉ có 2 bảng liên kết vs nhau! là bảng LICHBAY với LOAIMB! => k biết phải làm sao hết! @@ chỉ biết làm cái cách đếm thôi! ^^
    Nếu mà 3 bảng thì mình thấy có bảng PHANCONG cũng có khóa tham chiếu đó. Nhưng mà 2 bàng LICHBAY & LOAIMB cũng đủ rồi.
    Hiển tham khảo:
    Code:
    select distinct ngaydi from lichbay lich1
    where 
    not exists
        (select maloai from loaimb loai1 where hangsx='boeing'
            and maloai 
                not in
                (select lich2.maloai from loaimb loai2, lichbay lich2
                where lich2.maloai = loai2.maloai
                         and lich1.ngaydi = lich2.ngaydi)
         );
    Mặc dù trả lời hơi trễ nhưng mong bỏ quá.

    Leave a comment:

  • 11520104
    Nguyễn Quang Hiển

  • 11520104
    replied
    tạch rùi! =))

    Leave a comment:

  • is.9vnn
    Thành viên mới

  • is.9vnn
    replied
    ác :sad: hix, đúng là không có ra, chán quá, thôi bạn cứ đếm cho nó đơn giản, thi tốt nhé

    Leave a comment:

  • 11520104
    Nguyễn Quang Hiển

  • 11520104
    replied
    thấy cách này vẫn hiệu quả nhất! code ngắn nữa!
    SELECT NGAYDI
    FROM (select DISTINCT NGAYDI, LB.MALOAI
    FROM LICHBAY LB, LOAIMB LMB
    WHERE HANGSX='Boeing' AND LMB.MALOAI=LB.MALOAI) AS A
    GROUP BY NGAYDI HAVING COUNT(*) = ALL
    (SELECT COUNT(*)
    FROM LOAIMB
    WHERE HANGSX='Boeing')

    Leave a comment:

  • 11520104
    Nguyễn Quang Hiển

  • 11520104
    replied
    Originally posted by is.9vnn View Post
    --cách này mình thử dùng phép trừ nè:

    select lb.ngaydi
    from lichbay lb
    where not exists
    (select maloai from loaimb where hangsx = 'Boeing'
    except
    (select maloai from maybay where maybay.sohieu = lb.sohieu))
    không đc bạn ơi!! (_ _) còn cái count-compare kia thì mình làm từ lâu ời! thui kệ! còn vài chục phút nữa thi! ^^
    kèm file query nèk! ai rảnh vào làm cho vui! @@
    qlcb.rar

    Leave a comment:

  • is.9vnn
    Thành viên mới

  • is.9vnn
    replied
    Originally posted by 11520104 View Post
    1) KHACHHANG(MAKH, TEN, DCHI, DTHOAI)

    2) NHANVIEN(MANV,TEN, DCHI, DTHOAI, LUONG, LOAINV)

    3) LOAIMB(MALOAI, HANGSX)

    4) MAYBAY(SOHIEU, MALOAI)

    5) CHUYENBAY(MACB, SBDI, SBDEN, GIODI, GIODEN)

    6) LICHBAY(NGAYDI, MACB, SOHIEU, MALOAI)

    7) DATCHO(MAKH, NGAYDI, MACB)

    8) KHANANG(MANV, MALOAI)

    9) PHANCONG(MANV, NGAYDI, MACB)

    đề ra là: Cho biết ngày đi nào mà có tất cả các loại máy bay của hãng (HANGSX) = 'Boeing' tham gia
    các bác làm hộ em! (_ _)
    hi, mh làm thử nha ^_^", có gì sai sót giúp mh với
    select lb.ngaydi
    from lichbay inner join maybay on lb.sohieu = maybay.sohieu
    where maybay.maloai in (select maloai from loaimb where hangsx = 'Boeing')
    group by lb.ngaydi
    having count(distinct lb.maloai) = (select count(distinct maloai) from loaimb where hangsx = 'Boeing')
    --cách này mình thử dùng phép trừ nè:

    select lb.ngaydi
    from lichbay lb
    where not exists
    (select maloai from loaimb where hangsx = 'Boeing'
    except
    (select maloai from maybay where maybay.sohieu = lb.sohieu))
    is.9vnn
    Thành viên mới
    Last edited by is.9vnn; 28-11-2012, 00:56.

    Leave a comment:

  • 11520104
    Nguyễn Quang Hiển

  • 11520104
    replied
    àh! mình thấy là phép chia dùng not exists lúc nào cũng có 3 bảng! vd bài đầu tiên của chủ thớt! có 3 bảng là HOADON, CTHD và SANPHAM! còn cái bài tập cô đưa cho mình về làm, chỉ có 2 bảng liên kết vs nhau! là bảng LICHBAY với LOAIMB! => k biết phải làm sao hết! @@ chỉ biết làm cái cách đếm thôi! ^^

    Leave a comment:

  • 11520246
    Huỳnh Trọng Nghĩa

  • 11520246
    replied
    Originally posted by 11520104 View Post
    cho em hỏi? câu lệnh là như này:

    Code:
    Select sohd
    from HOADON
    where not exists (
                              select * from SANPHAM
                              where nuocsx=‘Trung Quoc’ and not exists (
                                                                                             select * 
                                                                                             from CTHD
                                                                                             where HOADON.sohd=CTHD.sohd and CTHD.masp=SANPHAM.masp))
    vậy nếu em chuyển qua thành

    Code:
    select SOHD 
    from (select  CTHD.SOHD, CTHD.masp
             from CTHD, SANPHAM 
             where nuocsx='Trung Quoc' and CTHD.masp=SANPHAM.masp) as A
    group by SOHD
    having count(*) = all
                                  (select count(*) 
                                   from SANPHAM
                                   where nuocsx='Trung Quoc')
    vậy cho em hỏi là cái code em chuyển qua nó còn là phép chia k??? tại em thấy nếu để như z chỉ cần sử dụng 2 bảng nhưng vẫn giữ đc mục đích! với lại nhiều bài thầy cô cho, chỉ có thể sử dụng được 2 bảng! em kiếm mãi k thể ra được bảng thứ 3! (_ _) mọi người chỉ giúp em!
    Mình thấy bạn chuyển sang như vậy, vẫn thể hiện đúng phép chia (thực ra thì thể hiện trong SQL đều là thay thế tương đương cho phép chia). Mình đọc bên này thì có 3 cách, và có cách tương đồng giống như bạn chuyển qua vậy. Còn bảng thứ 3 là sao? Bạn nói rõ hơn được không.
    Originally posted by 11520104 View Post
    1) KHACHHANG(MAKH, TEN, DCHI, DTHOAI)

    2) NHANVIEN(MANV,TEN, DCHI, DTHOAI, LUONG, LOAINV)

    3) LOAIMB(MALOAI, HANGSX)

    4) MAYBAY(SOHIEU, MALOAI)

    5) CHUYENBAY(MACB, SBDI, SBDEN, GIODI, GIODEN)

    6) LICHBAY(NGAYDI, MACB, SOHIEU, MALOAI)

    7) DATCHO(MAKH, NGAYDI, MACB)

    8) KHANANG(MANV, MALOAI)

    9) PHANCONG(MANV, NGAYDI, MACB)

    đề ra là: Cho biết ngày đi nào mà có tất cả các loại máy bay của hãng (HANGSX) = 'Boeing' tham gia
    các bác làm hộ em! (_ _)
    Hiển thử tìm TẤT CẢ các loại máy bay do hãng Boeing sản xuất trước, rồi vận dụng phép chia như câu ở trên thì chắc được. Có gì thì đưa lên đây cho mọi người cùng coi.

    Leave a comment:

  • 11520104
    Nguyễn Quang Hiển

  • 11520104
    replied
    1) KHACHHANG(MAKH, TEN, DCHI, DTHOAI)

    2) NHANVIEN(MANV,TEN, DCHI, DTHOAI, LUONG, LOAINV)

    3) LOAIMB(MALOAI, HANGSX)

    4) MAYBAY(SOHIEU, MALOAI)

    5) CHUYENBAY(MACB, SBDI, SBDEN, GIODI, GIODEN)

    6) LICHBAY(NGAYDI, MACB, SOHIEU, MALOAI)

    7) DATCHO(MAKH, NGAYDI, MACB)

    8) KHANANG(MANV, MALOAI)

    9) PHANCONG(MANV, NGAYDI, MACB)

    đề ra là: Cho biết ngày đi nào mà có tất cả các loại máy bay của hãng (HANGSX) = 'Boeing' tham gia
    các bác làm hộ em! (_ _)

    Leave a comment:

  • 11520104
    Nguyễn Quang Hiển

  • 11520104
    replied
    cho em hỏi? câu lệnh là như này:

    Code:
    Select sohd
    from HOADON
    where not exists (
                              select * from SANPHAM
                              where nuocsx=‘Trung Quoc’ and not exists (
                                                                                             select * 
                                                                                             from CTHD
                                                                                             where HOADON.sohd=CTHD.sohd and CTHD.masp=SANPHAM.masp))
    vậy nếu em chuyển qua thành

    Code:
    select SOHD 
    from (select  CTHD.SOHD, CTHD.masp
             from CTHD, SANPHAM 
             where nuocsx='Trung Quoc' and CTHD.masp=SANPHAM.masp) as A
    group by SOHD
    having count(*) = all
                                  (select count(*) 
                                   from SANPHAM
                                   where nuocsx='Trung Quoc')
    vậy cho em hỏi là cái code em chuyển qua nó còn là phép chia k??? tại em thấy nếu để như z chỉ cần sử dụng 2 bảng nhưng vẫn giữ đc mục đích! với lại nhiều bài thầy cô cho, chỉ có thể sử dụng được 2 bảng! em kiếm mãi k thể ra được bảng thứ 3! (_ _) mọi người chỉ giúp em!
    11520104
    Nguyễn Quang Hiển
    Last edited by 11520104; 27-11-2012, 10:48.

    Leave a comment:

  • 10520312
    Đỗ Văn Tuấn

  • 10520312
    replied
    Bạn xem bài này có thể giúp ít cho bạn : http://tuoitrevui.net/@forum/threads...chia-trong-sql

    Leave a comment:

  • anewmember
    Thành viên mới

  • anewmember
    replied
    mình cũng không hiểu chỗ này mày mò mãi không ra nếu theo bạn Nguyễn Hồ Trọng Thảo mà cắt bớt câu lệnh thì không được

    select * from SANPHAM
    where nuocsx=‘Trung Quoc’ and not exists (
    select * from CTHD
    where HOADON.sohd=CTHD.sohd and CTHD.masp=SANPHAM.masp)
    )
    câu lệnh trên thì báo lỗi

    The multi-part identifier "HOADON.sohd" could not be bound.
    còn không cắt bớt như

    Select sohd
    from HOADON
    where not exists (
    select * from SANPHAM
    where nuocsx=‘Trung Quoc’ and not exists (
    select * from CTHD
    where HOADON.sohd=CTHD.sohd and CTHD.masp=SANPHAM.masp)
    )
    thì chạy ngon.Bạn nào có thể giải thích lại giùm

    Leave a comment:

  • 10520140
    Nguyễn Hồ Trọng Thảo

  • 10520140
    replied
    Code:
    select * from SANPHAM 
                where nuocsx=‘Trung Quoc’ and not exists (
                            select * from CTHD
                            where HOADON.sohd=CTHD.sohd and CTHD.masp=SANPHAM.masp)
                            )
    Câu truy vấn này nó trả về bộ giá trị của bảng SanPham (Nếu cả 2 điều kiện sau Where cùng đúng)
    Bộ giá trị này chính là những sản phẩm của Trung Quốc mà SoHD chưa mua, nếu không trả về bộ giá trị nào thì có nghĩa là đã mua tất cả sản phẩm.
    Vậy khi đưa câu truy vấn này vào điều kiện NOT EXIST phía ngoài thì ta biết được SoHD đã mua hết tất cả sản phẩm của TQ hay chưa...???

    Leave a comment:

  • 10520191
    Châu Tiếng Việt

  • 10520191
    replied
    Originally posted by 10520140 View Post
    Mình chỉnh lại code của bạn cho dễ nhìn

    Code:
    Select sohd 
    from HOADON 
    where not exists (
                select * from SANPHAM 
                where nuocsx=‘Trung Quoc’ and not exists (
                            select * from CTHD
                            where HOADON.sohd=CTHD.sohd and CTHD.masp=SANPHAM.masp)
                            )
    Theo mình, bài này để dễ hiểu, bạn có thể phân tích từ trong ra ngoài:

    Code:
    select * from SANPHAM 
                where nuocsx=‘Trung Quoc’ and not exists (
                            select * from CTHD
                            where HOADON.sohd=CTHD.sohd and CTHD.masp=SANPHAM.masp)
                            )
    Đây chính là những sản phẩm mà SoHD đó chưa mua (Phép trừ sử dụng NOT EXISTS: Tất cả sản phẩm - Sản phẩm đã mua)

    NOT EXISTS trả về giá trị True khi không có bộ giá trị nào trả về.

    Đưa câu truy vấn "Những sản phẩm mà SoHD đó chưa mua" trở thành điều kiện NOT EXISTS nữa thì sẽ được câu truy vấn phép chia hoàn chỉnh mà bạn đã có. Chắc chắn bạn sẽ tự suy ra được kết quả là: Số HD đã mua tất cả sản phẩm do Trung Quốc sản xuất.
    Mình cảm ơn bạn rất nhiu, nhưng thực sự bạn giải thích mình ko rõ lắm.
    Code:
    select * from SANPHAM 
                where nuocsx=‘Trung Quoc’ and not exists (
                            select * from CTHD
                            where HOADON.sohd=CTHD.sohd and CTHD.masp=SANPHAM.masp)
                            )
    Cái này, nếu có giá trị trả về thì nó trả về các bộ giá trị của table HoaDon hay SanPham

    Leave a comment:

LHQC

Collapse
Working...
X