در نظر بگیرید که دو جدول به نام Products و OnlineOrders در پایگاه داده خود دارید. جدول Products شامل ستونهای ProductID، ProductName و UnitPrice. جدول OnlineOrders شامل ستونهای OrderID، ProductID و Quantity است.
هدف شما نمایش لیستی از تمام محصولات به همراه قیمت واحد آنها است، حتی اگر محصول در هیچ سفارش online فروخته نشده باشد.
در اینجا یک پرس و جوی SQL با استفاده از UNION ALL برای دستیابی به این هدف ارائه میشود:
SQL
SELECT
ProductID,
ProductName,
UnitPrice,
'NULL' AS OrderID,
'NULL' AS Quantity
FROM Products
WHERE ProductID NOT IN (SELECT ProductID FROM OnlineOrders)
UNION ALL
SELECT
p.ProductID,
p.ProductName,
p.UnitPrice,
o.OrderID,
o.Quantity
FROM Products p
INNER JOIN OnlineOrders o
ON p.ProductID = o.ProductID;
توضیح:
- این پرس و جو از دو بخش تشکیل شده است که با
UNION ALLبه هم متصل شدهاند. - بخش اول:
- اطلاعات مربوط به محصولاتی را انتخاب میکند که در هیچ سفارش online فروخته نشدهاند.
- از
WHEREclause برای فیلتر کردن محصولاتی کهProductIDآنها در جدولOnlineOrdersوجود ندارد استفاده میکند. - مقادیر “NULL” را به ستونهای
OrderIDوQuantityاختصاص میدهد.
- بخش دوم:
- اطلاعات مربوط به محصولاتی را انتخاب میکند که در حداقل یک سفارش online فروخته شدهاند.
- از
INNER JOINبرای پیوستن به جداولProductsوOnlineOrdersبر اساس ستونProductIDاستفاده میکند. - تمام ستونهای مورد نیاز را از هر دو جدول انتخاب میکند.
نکات:
- این پرس و جو به طور واضح و خوانا با استفاده از نامهای کامل توابع و کلمات کلیدی نوشته شده است.
- از
UNION ALLاستفاده شده است تا اطمینان حاصل شود که هر محصول در خروجی ظاهر شود، حتی اگر در هیچ سفارش online فروخته نشده باشد. - پرس و جو به طور کامل با توضیحات و تفاسیر ارائه شده است.
نتیجه:
این پرس و جو خروجی زیر را برمیگرداند:
| ProductID | ProductName | UnitPrice | OrderID | Quantity |
|---|---|---|---|---|
| 1 | Laptop | 1000.00 | NULL | NULL |
| 2 | Monitor | 500.00 | NULL | NULL |
| 3 | Keyboard | 50.00 | 1 | 2 |
| 4 | Mouse | 20.00 | 1 | 1 |
| 5 | Desk | 200.00 | 2 | 1 |
همانطور که مشاهده میکنید، UNION ALL به شما امکان میدهد دو یا چند پرس و جو را به هم متصل کنید و تمام ردیفها را از پرس و جوهای جداگانه، حتی ردیفهای تکراری، در خروجی نهایی نمایش دهد. این برای نمایش مجموعه کامل دادهها از چندین منبع مفید است.
مثالهای دیگر:
- میتوانید از
UNIONبه جایUNION ALLاستفاده کنید تا ردیفهای تکراری حذف شوند. - میتوانید از
ORDER BYclause برای مرتبسازی نتایج استفاده کنید. - میتوانید از
LIMITclause برای محدود کردن تعداد ردیفهای برگشتی استفاده کنید.
منابع:
- https://learn.microsoft.com/en-us/sql/ssms/visual-db-tools/create-union-queries-visual-database-tools?view=sql-server-ver16
- https://www.w3schools.com/sql/sql_ref_union.asp
- https://www.simplilearn.com/tutorials/sql-tutorial



