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

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

    Sử dụng NOT EXISTS
    Ví dụ: Tìm số hóa đơn đã mua tất cả những sản phẩm do “Trung Quoc” sản xuất.
    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))

    Giải thích giùm em cái, cái này hồi trước học mà cô dạy giải thích em ko hiểu.

  • #2
    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.

    Comment


    • #3
      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

      Comment


      • #4
        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...???

        Comment


        • #5
          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

          Comment


          • #6
            Bạn xem bài này có thể giúp ít cho bạn : http://tuoitrevui.net/@forum/threads...chia-trong-sql
            Blog chia sẻ kiến thức
            http://webb.com.vn

            Comment


            • #7
              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!
              Last edited by 11520104; 27-11-2012, 10:48.

              Comment


              • #8
                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! (_ _)

                Comment


                • #9
                  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.
                  Thân Lãng Tử Phiêu Du Theo Ngàn Gió,
                  Chốn Phiêu Hồng Buông Kiếm Tựa Hồng Nhan

                  Đời Đạo Gian

                  Comment


                  • #10
                    à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! ^^

                    Comment


                    • #11
                      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))
                      Last edited by is.9vnn; 28-11-2012, 00:56.

                      Comment


                      • #12
                        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

                        Comment


                        • #13
                          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')

                          Comment


                          • #14
                            á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é

                            Comment


                            • #15
                              tạch rùi! =))

                              Comment

                              LHQC

                              Collapse
                              Working...
                              X