Golden Basim Ответов: 0

Как заставить mysql VIEW показывать все записи, даже если в левой таблице нет никаких совпадений записей.


как заставить MySQL VIEW показывать все записи, даже если в левой таблице нет никаких совпадений записей.

Что я уже пробовал:

мой код, который я пробовал :

CREATE OR REPLACE VIEW `view_shortages_with_store` as
                         SELECT st.store_ID,
                         st.store_Name, 
                         sti.stitems_Name,
						 sti.stitems_Type,
					  	 sti.stcate_ID,
						 sti.stitems_EpireDateStatus,
						 sti.stitems_MinBalance,
						 sti.stitems_stagnant,
                         IF(ISNULL(ca.stitems_ID), pa.stitems_ID, ca.stitems_ID)
							AS stitems_ID,
                         COALESCE(ca.Amount, 0) + COALESCE(pa.Amount,0) AS Stock
                        FROM st_stores st
                        LEFT JOIN (SELECT sns.stitems_ID,
                                                sns.StoreID,
        		                 SUM(sns.StockQnty) AS Amount
                          FROM stock_noserials sns
                          GROUP BY sns.stitems_ID, sns.StoreID) ca
                        ON ca.StoreID = st.store_ID
                        LEFT JOIN (SELECT pis.stitems_ID,
                                                pis.ss_StoreID,
        		                 COUNT(*) AS Amount
                          FROM purchases_item_seriels pis
                          WHERE pis.pis_Statues IN (0, 5, 6)
                          GROUP BY pis.stitems_ID , pis.ss_StoreID) pa
                        ON pa.ss_StoreID = st.store_ID
                        
                        
                        INNER JOIN (SELECT sts.stitems_ID,
                                                sts.stitems_Name,
                                                sts.stitems_Type,
                                                sts.stcate_ID,
                                                sts.stitems_EpireDateStatus,
                                                sts.stitems_MinBalance,
                                                sts.stitems_stagnant
                          FROM st_items sts
                          GROUP BY sts.stitems_ID) sti
                        ON sti.stitems_ID = ca.stitems_ID ||sti.stitems_ID = pa.stitems_ID 
                                    
                        WHERE COALESCE(ca.Amount, 0) + COALESCE(pa.Amount,0) < sti.stitems_MinBalance 
                        GROUP BY st.store_ID,sti.stitems_ID,COALESCE(ca.Amount, 0) + COALESCE(pa.Amount,0);



Бывший для того что мне нужно :
если (ПУНКТ А) имеет шток (5) в (1 магазин), и акции(0) _there не records_ в (магазин 2) показать результаты:
----------------------------------------------------
store      | item               | stock
1          | item A             | 5
2          | item A             | 0
3          | item A             | 0
4          | item A             | 0
----------------------------------------------------

Gerry Schmitz

Используйте промежуточные запросы. Это сделает вещи более понятными. "Левое соединение" просто; это все остальное, что вы бросили в смесь, которая путает вещи без видимой причины, кроме "давайте сделаем это одно утверждение").

#realJSOP

Мне нравятся CTEs, но я не знаю, поддерживает ли их MySQL...

Gerry Schmitz

Обычно я использую "временные столы", но я ожидаю, что большинство людей не хотят заниматься домашним хозяйством. Мне нужно иметь возможность проверить свои результаты в любой момент, чтобы согреться. Я обнаружил, что оптимизатор запросов не умнее моих "промежуточных запросов". Модель также хорошо работает при преобразовании кода SAS в T-SQL.

#realJSOP

преимущество использования временных таблиц заключается в том, что вы можете создавать применимые индексы на них, делая последующие запросы к ним намного быстрее - вы не можете сделать это с CTE.

CHill60

Измените это внутреннее соединение на левое соединение

0 Ответов