SqlServer bilan * mavjud emas

Buyurtma va mijozlar sifatida ikki ustunli Buyurtma va ikkita ustunli iste'molchilar mijozlar va manzil sifatida oldim.

Men nima qilmoqchiman, Buyurtmachida bo'lmagan mijozlar jadvalidagi barcha mijozlarni topish. Misol uchun, Customers.customerid = {A, B, C, D}, Orders.customerid = {A, B, C}, men nima qilishim kerakligini taxmin qilish, faqat Buyurtmalarni qabul qilishdir, ammo Buyurtmalarda mavjud emas. Bunga erishish uchun men qo'ydim,

select customerid from Customers where customerid not exists (select customerid from Orders)

Lekin hech narsa qaytarilmaydi. Mening mantiqim oddiy bo'lib, birinchi navbatda jadvalda buyurtmalarni olgan barcha mijozlar bor, keyin buyurtmachining buyurtmachilaridan mijozlar tarkibiga kirmaydi. Nima uchun bu noto'g'ri ekanini ko'ra olmayapman.

Buni keyinroq sinab ko'rdim va u ishlaydi. Kimga menga pls yordam berishi mumkin?

select customerid from Customers as c where customerid not exists(select customerid from orders as o where c.customerid = o.customerid)

Nima uchun c.customerid = o.customerid qo'shish kerak?

0
SQL Server bu so'rovni biron-bir ogohlantirish yoki xatosiz ishga tushirishiga amin emasman, lekin sizning savolingiz juda sodda, shuni so'rashdan oldin EXISTS iborasini o'qib tushunishingiz kerak: technet.microsoft.com/en-us/library/ms189259 (v = sql.105) .aspx
qo'shib qo'ydi muallif Pham X. Bach, manba

6 javoblar

Nima uchun c.customerid = o.customerid qo'shish kerak?

Chunki ma'lumotlar bazasida ikki ustun uchun bir xil nomdan foydalanayotganingiz sababli, bu har qanday aniq munosabatlarning o'zaro kuchga kirishi yoki qabul etilishi degani emas.

Ushbu ikki ustunning teng shartlariga qiziqish bildirganingiz uchun c.customerid = o.customerid ni qo'shishingiz kerak.

Ammo boshqa korrelyatsiya shartlari til bilan ruxsat berilgan dir. Masalan, so'rovni yozishingiz mumkin:

select customerid from Customers as c where not exists(
    select customerid from Customers as c2 where c2.customerid < c.customerid)

customerid qiymatlari bo'yicha tartiblangan mijozlarni hisobga olsangiz, bu "birinchi" mijozni topadi (bu so'rovni yozishning eng yaxshi usuli emas, balki bu moslashuvchanlikning namoyishidir)


Sizning dastlabki so'rovingiz "Buyurtma stolida hech qanday satr mavjud bo'lmagan shartlarda" menga "Xaridor jadvalidan barcha satrlarni bering" - bu sizning so'raganingizda juda yaxshi bo'lgan narsadir, ammo siz nima maqsadda sizning ikkinchi so'rovingizda nima qilganingizdan qat'iy nazar, ba'zi bir korrelyatsiya shaklini bajaring.

1
qo'shib qo'ydi
Sizning javobingiz uchun rahmat, hozir juda aniq!
qo'shib qo'ydi muallif Ranger 22, manba

@Damien_The_Unbeliever to'g'ri tushuntirish berdi va shu kabi sinash kerak

2 ta jadval uchun yaratilgan ba'zi ma'lumotlar bilan

CREATE TABLE #Orders
    (orderid varchar(10), customerid varchar(10))
insert into #Orders values
('venkat','a'),
('raj','b'),
('mahes','c')

CREATE TABLE #Customers
    (customerid varchar(10), [location] varchar(10))
insert into #Customers values
('a','and'),
('b','bar'),
('c','board'),
('D','board1')


SELECT cu.customerid from #Customers CU WHERE NOT EXISTS 
    (
      SELECT 1 FROM #orders b WHERE Cu.customerid = b.customerid
    )

chiqdi

customerid
D
0
qo'shib qo'ydi
Try below query :

SELECT customerid from Customers C WHERE NOT EXISTS 
(
  SELECT 1 FROM orders O WHERE C.customerid = O.customerid
)
0
qo'shib qo'ydi

Sintaksis biroz o'chirilgan. Siz shunday yozmoqchisiz:

SELECT C.CustomerID
FROM Customers C
WHERE NOT EXISTS
    (
    SELECT O.CustomerID
    FROM Orders O
    WHERE O.CustomerID = C.CustomerID
    )
;

Siz buni NOT IN bilan ham qilishingiz mumkin, shunday:

SELECT customerid
FROM Customers
WHERE customerid NOT IN
(
    SELECT customerid
    FROM Orders
)
;

Ikkala tomon ham semantik jihatdan tengdir.

Ba'zi odamlar sizga LEFT JOIN/IS NULL konstruktsiyasi bilan bir xil narsalarni qilishingiz mumkinligini aytishi mumkin, lekin siz " ushbu maqola nima uchun bu qashshoq tanlash Ko'p hollarda.

0
qo'shib qo'ydi

Sizga kerak bo'lishi mumkin:

select customerid from Customers where customerid not in (select customerid from Orders)
0
qo'shib qo'ydi
oldinroq uni sinab ko'rdim, lekin bu hali hech narsa bermaydi.
qo'shib qo'ydi muallif Ranger 22, manba
Men ikkinchi so'rov nima uchun ishlayotganini bilmayman, lekin birinchisi yo'q, deb o'ylayman, men sahnaning orqasida bilmagan narsam bor, deb o'ylayman
qo'shib qo'ydi muallif Ranger 22, manba

nima kerak

select c.customerid from customer c inner join order o on c.customerid = o.customerid where c.customerid not in (select od.customerid from order od)

ularga 2 ta jadvalga qo'shilmasdan ma'lumotlarga kira olmaysiz.

0
qo'shib qo'ydi