PDA

View Full Version : نمایش فیلدهای null



zizi_zizi69
پنج شنبه 09 دی 1389, 01:59 صبح
سلام
من دو تا جدول دارم به اسم های book, order_detail هر دو دارای فیلد isbn هستند و توسط این فیلد باهم join شدند.
در جدول order_detail یکسری سفارش داریم با نام فیلد orderId که با یک سفارش(orderId )می تونیم چنیدن کتاب خریده باشیم.( بین جداول ارتباط چند به چند.)
حالا من می خوام بدونم برای هر سفارش چه کتاب هایی خریده شده و چه کتاب هایی خریده نشده.
یعنی وقتی group by می کنیم براساس orderId نه تنها کتاب های خریده شده بکله کتاب های خریده نشده رو هم نشون بده.
با انواع join ها جواب نداد؟؟؟!!!!! ،از کرسر هم نمی خوام استفاده کنم.

mtorabi
پنج شنبه 09 دی 1389, 09:22 صبح
سلام
من دو تا جدول دارم به اسم های book, order_detail هر دو دارای فیلد isbn هستند و توسط این فیلد باهم join شدند.
در جدول order_detail یکسری سفارش داریم با نام فیلد orderId که با یک سفارش(orderId )می تونیم چنیدن کتاب خریده باشیم.( بین جداول ارتباط چند به چند.)
حالا من می خوام بدونم برای هر سفارش چه کتاب هایی خریده شده و چه کتاب هایی خریده نشده.
یعنی وقتی group by می کنیم براساس orderId نه تنها کتاب های خریده شده بکله کتاب های خریده نشده رو هم نشون بده.
با انواع join ها جواب نداد؟؟؟!!!!! ،از کرسر هم نمی خوام استفاده کنم.


دوست خوبم من دقیقا ساختار جداول رو متوجه نشدم پس تمام حدس هام رو می نویسم

اول: orderId در جدول order_detail کلید اصلی باشه:
در این صورت یا شما تنها یک ستون isbn در جدول order_detail داری که بعیده چون گفتی: "با یک سفارش(orderId )می تونیم چنیدن کتاب خریده باشیم.( بین جداول ارتباط چند به چند.)"
یا اینکه چندین ستون isbn داری که در اینصورت ساختار جدولت نرمال شده نیست
البته حالت سومی هم داره که لیست کتاب های هر سفارش در جدول سومی نگهداری بشه که اگه اینطوری هم باشه شما بهش اشاره نکردی

دوم: orderId در جدول order_detail کلیک اصلی نباشه:
در این صورت این سوال که لیست کتاب های خریداری نشده برای هر orderId کدام است قابل پاسخ بوده :




SELECT name
FROM book AS book_2
WHERE (NOT EXISTS
(SELECT book_1.name
FROM book AS book_1 INNER JOIN
[order_detail] AS order_1 ON book_1.isbn = order_1.isbn
WHERE (order_1.orderID = @OrderID) AND (book_2.name = book_1.name)))

این query لیست تمام کتاب هایی که برای orderID = @OrderID فروخته نشده است را نشان می دهد
توضیح اینکه name (نام کتاب) و isbn دو ستون جدول book که isbn کلید اصلی آن است
و orderID و keyID(که در query نیامده) دوستون جدول order_Detail که keyID کلید اصلی آن است

در این حالت امکان نمایش خریده شده ها با خریده نشده ها با هم نیست یا در حال حاضر چیزی به ذهنم نمی رسد. باز فکر می کنم اگه چیزی به ذهنم رسید اضافه می کنم... اگر ساختار جداول هم متفاوت از حدس های من بود بگو... امیدوارم مشکلت حل شه

zizi_zizi69
پنج شنبه 09 دی 1389, 11:11 صبح
شما به مورد group by توجه نکردید من می خوام کتاب های که توسط سفارش معین خریداری نشده به نتیجه برسم.
این query شما فقط در سطح فروش کلی جواب داره.(همه سفارش ها)

mtorabi
پنج شنبه 09 دی 1389, 15:34 عصر
شما به مورد group by توجه نکردید من می خوام کتاب های که توسط سفارش معین خریداری نشده به نتیجه برسم.
این query شما فقط در سطح فروش کلی جواب داره.(همه سفارش ها)

والا به خدا این query رو اگه بنویسی اولش باید بهش یه orderID معین بدی تا لیست کتاب های خریداری نشده رو برگردونه... در query دقت کن از متغیر orderID@ استفاده شده

می شه نتیجه گرفت حدس دوم من در مورد ساختار جداول شما درست بوده... اگه متوجه کد نمی شید من یه فایل اجرایی آپلود کنم
در رابطه با استفاده از group by در query قبل نیاز به استفاده از آن نبود اما شما می تونی لیست کتاب های خریداری شده رو با query زیر نیز بدست بیارید:


SELECT COUNT([order].keyID) AS NO, [order].orderID, book.name
FROM book LEFT OUTER JOIN
[order] ON book.isbn = [order].isbn
GROUP BY [order].orderID, book.name
HAVING ([order].orderID = @orderID)

تاکید می کنم این پرس و جو نیز تنها لیست کتاب های فروخته شده را برای یک orderID معین باز می گرداند

zizi_zizi69
پنج شنبه 09 دی 1389, 22:18 عصر
درسته من بهorderID@ دقت نکرده بود،خوب حالا چطور باید روی OrderId حرکت کنم.
من خودم این Query رو به همین روش بدون پارامتر نوشتم .از group by هم استفاده کردم.
فیلد های جداولم هم اینه
جدول کتاب:(ISBN:primary key)
جدول سفارش:OrderID,ItemNO هر دو کلید،ISBN،Quantity.
مثلا مجموعه کتاب ها {1111و2222و3333و4444و5555}
سفارش اول با OrderID=1:
{2222,3333,5555}
نتیجه:{YES,NO,YES,YES,NO}

ممنون

mtorabi
شنبه 11 دی 1389, 04:35 صبح
درسته من بهorderID@ دقت نکرده بود،خوب حالا چطور باید روی OrderId حرکت کنم.
من خودم این Query رو به همین روش بدون پارامتر نوشتم .از group by هم استفاده کردم.
فیلد های جداولم هم اینه
جدول کتاب:(ISBN:primary key)
جدول سفارش:OrderID,ItemNO هر دو کلید،ISBN،Quantity.
مثلا مجموعه کتاب ها {1111و2222و3333و4444و5555}
سفارش اول با OrderID=1:
{2222,3333,5555}
نتیجه:{YES,NO,YES,YES,NO}

ممنون


یه query جدید نوشتم که بیشتر به اون چیزی که می خوای نزدیک باشه البته این بار عکس نتیجه اش رو هم واست گذاشتم امیدوارم به کارت بیاد...


SELECT i AS Book_isbn, s AS Sells, n AS NotSells
FROM (SELECT b1.isbn AS i , null AS s, 1 AS n
FROM book AS b1
WHERE (NOT EXISTS
(SELECT *
FROM book AS b3 INNER JOIN
[order] AS o2 ON b3.isbn = o2.isbn
WHERE ((o2.orderID = @orderID) AND (b3.name = b1.name))))
UNION ALL
SELECT b2.isbn AS i , 1 AS s, null AS n
FROM book AS b2 INNER JOIN
[order] AS o1 ON b2.isbn = o1.isbn
WHERE o1.orderID = @orderID) DERIVEDTBL
ORDER BY Book_isbn
در عکس مشخصات جداول رو آوردم پس اینجا تکرار نمی کنم

6437964380

zizi_zizi69
یک شنبه 12 دی 1389, 12:23 عصر
select case when b.isbn in(
select o.isbn from ORDER_DETAIL o
where o.ORDERID=1

)
then 'YES'
else 'NO' end as result

from book b;

من این کد را نوشتم و برای orderid معین جواب می ده ولی مشکل من این بود که نمی تونستم براش حلقه بنویسم چون تعداد orderid خیلی زیاد است و دستی نمی شه کار کرد.
در نوشتن حلقه با ارور زیر مواجه می شدم با هر نوعی از loop بعد فهمیدم گویا استفاده از پارامترها در
pl/sql خیلی با sql تفاوت داره.:اشتباه:

an INTO clause is expected in this SELECT statement

گویا باید از Dynamic SQL که یک جورایی با مفهوم cursor ارتباط داره:ناراحت: استفاده کنم.