WHERE iborasi bilan JOINdan so'ng SQL WHERE iborasi

Men ba'zi ma'lumotlarni tanlashga harakat qilyapman, men birga 3 ta jadvalga qo'shilaman, biroq qo'shilishlardan biri qaerda bayon qilingan. Birlashtirilgandan keyin, sana oralig'ini va joylashuvni tanlash uchun boshqa qaerda ko'rsatma qo'shish kerak. Ikkinchi WHERE so'zidan xato olib turibman.

  SELECT a.[ID]
      ,a.[item_no]
      ,a.[qty]
  FROM [MYDB].[dbo].[details] AS a


  INNER JOIN [MYDB].[dbo].[delivery] AS b
  ON a.[item_no] = b.[item_no]
  INNER JOIN [MYDB].[dbo].[options] AS c
  ON a.[number] = c.[number] 
  WHERE a.[item_no] = c.[item_no]

WHERE b.[destination] = 'my destination'
AND b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 

Hech qanday yordamni ko'rsangiz kerak.

Rahmat

1
Xatolik yuzaga kelsa, uni sizning savolingizga joylashtirishingiz kerak, sizda ikkita echim bor. Birinchidan, shartlarni OShKORga qo'shib qo'yishingiz yoki boshqa AND bilan oxirgi WHERE-ga qo'shishingiz kerak.
qo'shib qo'ydi muallif Sami, manba
Agar va bilan O'N ni qo'shish uchun ishlatilsa, maslahat beraman. Natijalar boshqacha bo'lishi mumkin, lekin agar siz JOIN ni qisqartirayotgan bo'lsangiz, boshqa JOIN kodini emas, balki boshqa JOIN > JOIN b-ni tanlang
qo'shib qo'ydi muallif Red, manba

6 javoblar

Quyidagilarni sinab ko'ring

SELECT a.[ID]
      ,a.[item_no]
      ,a.[qty]
  FROM [MYDB].[dbo].[details] AS a


  INNER JOIN [MYDB].[dbo].[delivery] AS b
  ON a.[item_no] = b.[item_no]
  INNER JOIN [MYDB].[dbo].[options] AS c
  ON a.[number] = c.[number] 
  and a.[item_no] = c.[item_no]

WHERE b.[destination] = 'my destination'
AND b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 
4
qo'shib qo'ydi
JOIN ga yana bir shart qo'shish uchun siz AND kodini ishlatasiz. Bu har doim WHERE ga qo'shilgandek emas, shuning uchun ehtiyot bo'ling
qo'shib qo'ydi muallif Red, manba

JOIN bayonnomasida WHERE o'rniga AND dan foydalaning.

2
qo'shib qo'ydi

Just add WHERE clause & move a.[item_no] = c.[item_no] with ON clause :

SELECT a.[ID], a.[item_no], a.[qty]
FROM [MYDB].[dbo].[details] AS a INNER JOIN 
     [MYDB].[dbo].[delivery] AS b
     ON a.[item_no] = b.[item_no] INNER JOIN 
     [MYDB].[dbo].[options] AS c 
     ON a.[number] = c.[number] AND a.[item_no] = c.[item_no]
WHERE b.[destination] = 'my destination' AND
      b.[date] BETWEEN '2018-10-14' AND '2018-10-15'; 
1
qo'shib qo'ydi

Bitta so'rov uchun qaerda iborasi. Bu siz xohlagan narsalar bo'lishi kerak:

SELECT d.[ID], d.[item_no], d.[qty]
FROM [MYDB].[dbo].[details] d JOIN
     MYDB].[dbo].[delivery] dv
     ON d.[item_no] = dv.[item_no] JOIN
     [MYDB].[dbo].[options] o
     ON d.[number] = o.[number] AND d.[item_no] = o.[item_no]
WHERE dv.[destination] = 'my destination' AND
      dv.[date] BETWEEN '2018-10-14' AND '2018-10-15' ;

Jadval taxalluslarini jadvalning qisqartmalariga o'zgartirdim. Mantiqiy jadval taxalluslari so'rovni o'qish va saqlashni osonlashtiradi.

Birinchi WHERE so'zidagi holat JOIN shartidir. Bu WHERE so'zidan ko'ra ON so'ziga tegishlidir.

0
qo'shib qo'ydi

Sizning kodingizni tuzatishga yordam beradigan bir nechta javoblar mavjud, biroq men siz yashayotgan muammoga olib keladigan noto'g'ri tushunishni aniq bilmoqchi edim. Sizning savolingizga javob berdingiz:

... birlashmalardan biri qaerda bayon etilgan bo'lsa.

Lekin bu to'g'ri emas. WHERE so'zlari JOIN ning bir qismi emas, balki SELECT iborasining bir qismidir.

Umuman aytganda, SQL qidiruvi FROM ga qarash orqali so'rovingizni izohlashni boshlaydi. Aslida, bu sizning ma'lumotlaringiz qayerdan kelganligini so'rash bilan boshlanadi. Sizning FROM so'zingiz bazaviy jadvalingiz, [MYDB]. [Dbo]. [Batafsil] ga qo'shilasiz. YOIN kodingiz O'N belgilarga ko'ra, datchikda jadvaldagi qaysi maydonlarda mos keladigan ma'lumot nuqtalari mavjud. Agar INNER JOIN bo'lsa, bu WHERE qoidasining ta'siri bo'lgan natijada olingan ma'lumotlar to'plamini cheklash ta'siriga ega bo'lishi mumkin, lekin JOIN , so'rovingiz boshida vosita ma'lumotlarni xotiraga tortganda, so'rovning boshida bo'ladi.

After that initial data set is built, the engine reads the WHERE clause and applies any filters specified there.

MSDN munozarasi bu erda SELECT bayonotining mantiqiy ishlov berish tartibi .

JOIN ilovasida dastlabki ma'lumotlar majmuasiga kiritilgan ma'lumotlarning miqdorini cheklash uchun bir nechta ON shartlarini belgilashingiz mumkin. Misol uchun, sizning birinchi JOIN quyidagi kabi yozilishi mumkin:

INNER JOIN [MYDB].[dbo].[delivery] AS b
ON 
  a.[item_no] = b.[item_no]
  AND 
  b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 

INNER JOIN bilan, JOIN yoki WHERE da filtrlash mezonlarini qo'yish o'rtasida juda ko'p farq yo'q, lekin Tashqi kodi , natijalar keskin farq qilishi mumkin, shuning uchun SELECT iborasining har bir tarkibiy qismini va qachon bajarilishini tushunish muhimdir.

Barcha birlashmalaringiz INNER bo'lgani uchun, sizning so'rovingiz aslida WHERE deyimsiz shunday yozilishi mumkin:

SELECT a.[ID]
  ,a.[item_no]
  ,a.[qty]
FROM 
  [MYDB].[dbo].[details] AS a
INNER JOIN 
  [MYDB].[dbo].[delivery] AS b
  ON 
    a.[item_no] = b.[item_no]
    AND
    b.[destination] = 'my destination'
    AND 
    b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 
  INNER JOIN [MYDB].[dbo].[options] AS c
  ON 
    a.[number] = c.[number] 
    AND
    a.[item_no] = c.[item_no]

Xotiraga yoyilgan tizimlarda ON so'zidagi filtrlash xotira bosimini pasaytirishi mumkin va men ulardan foydalanganman, lekin ko'pchilik odamlar WHERE chunki biz odatda ma'lumotlar filtrlarini qidiramiz.

0
qo'shib qo'ydi

Mavjud WHERE moddasini kengaytirishingiz kerak.

SELECT a.[ID]
      ,a.[item_no]
      ,a.[qty]
  FROM [MYDB].[dbo].[details] AS a
  INNER JOIN [MYDB].[dbo].[delivery] AS b
  ON a.[item_no] = b.[item_no]
  INNER JOIN [MYDB].[dbo].[options] AS c
  ON a.[number] = c.[number] 
  WHERE a.[item_no] = c.[item_no] AND b.[destination] = 'my destination'
AND b.[date] BETWEEN '2018-10-14' AND '2018-10-15' 
0
qo'shib qo'ydi