2017-03-06 2 views
0

Je dois combiner 2 tables contenant ou non les données, mais j'ai besoin d'une jointure externe complète où la dernière table (si elle a un contenu où IsActive = 1) obtient montré que les données, au lieu des 2 premières tables combinées.Combinaison de 2 tables avec un OUTER JOIN sur une autre table

ont actuellement ceci:

(SELECT qp.ItemName AS name 
      , qp.TimeAdded AS created 
      , '' AS effective 
      , qp.VendorName AS supplier 
      , qp.Source AS source 
      , qp.VendorType AS type 
      , qp.Price AS cost 
      , '' AS price 
      , '' AS markup 
      , '' AS customer 
      , '' AS customerListID 
      , qp.VendorListID AS vendorListID 
      , '' AS itemListID 
    FROM  wp_quantum_purchases AS qp 
    WHERE  qp.IsActive = 1 AND 
      NOT EXISTS (SELECT 1 
         FROM wp_hunter_quote_parts AS hqp 
         WHERE qp.ItemName = hqp.ItemName AND 
           hqp.IsActive = 1)) 
UNION ALL 
(SELECT qs.ItemName AS name 
      , qs.TimeAdded AS created 
      , qs.SalesDate AS effective 
      , '' AS supplier 
      , qs.Source AS source 
      , '' AS type 
      , '' AS cost 
      , qs.Price AS price 
      , '' AS markup 
      , qs.CustomerName AS customer 
      , qs.CustomerListID AS customerListID 
      , '' AS vendorListID 
      , '' AS itemListID 
    FROM  wp_quantum_sales AS qs 
    WHERE  qs.IsActive = 1 AND 
      NOT EXISTS (SELECT 1 
         FROM wp_hunter_quote_parts AS hqp 
         WHERE qs.ItemName = hqp.ItemName AND 
           hqp.IsActive = 1)) 
UNION ALL 
(SELECT hqp.ItemName AS name 
      , hq.Quote_Date AS created 
      , hqp.SalesDate AS effective 
      , hqp.VendorName AS supplier 
      , hqp.Source AS source 
      , hqp.VendorType AS type 
      , hqp.Cost AS cost 
      , hqp.Price AS price 
      , CAST((((CAST(hqp.Price AS DECIMAL(10, 2)) - CAST(hqp.Cost AS DECIMAL(10, 2)))/CAST(hqp.Cost AS DECIMAL(10, 2))) * 100) AS DECIMAL(10, 2)) AS markup 
      , IFNULL(hq.Customer_FullName, 'N/A') AS customer 
      , hq.Customer_ListID AS customerListID 
      , hqp.VendorListID AS vendorListID 
      , hqp.Item_ListID AS itemListID 
    FROM  wp_hunter_quote_parts AS hqp 
    LEFT JOIN wp_hunter_quotes AS hq 
    ON  (hq.id = hqp.QuoteID) 
    WHERE  hqp.IsActive = 1) 
ORDER BY NAME ASC; 

Mais ceci est la duplication des données en 1ère et 2e tables et affiche les données deux fois. J'ai besoin que les données des 1er et 2ème tableaux soient combinées comme 1 (si existe), mais pour donner la priorité au dernier tableau (wp_hunter_quote_parts) ici comme le contenu à montrer, si IsActive = 1 existe dans la dernière table (wp_hunter_quote_parts). Cependant, si IsActive = 1 n'existe pas dans wp_hunter_quote_parts pour ItemName que je voudrais combiner à la fois wp_quantum_purchases et wp_quantum_sales comme s'il s'agissait d'une ligne.

Ne peut pas faire LEFT JOIN car les données pourraient exister dans wp_quantum_purchases, mais pas dans wp_quantum_sales OU Les données peuvent exister dans wp_quantum_sales et non dans wp_quantum_purchases ou les données ne pouvaient exister dans l'un de ces derniers, et existent seulement dans wp_hunter_quote_parts ainsi que des données pourrait même pas exister dans wp_hunter_quote_parts.

Donc, au fond, si ItemName existe dans wp_quantum_purchases ET IsActive = 1 ET wp_hunter_quote_parts n'a pas ItemName dans le tableau, obtenir des données d'achat de wp_quantum_purchases, d'autre si ItemName existe en wp_hunter_quote_parts obtenir des données de hunter_quote_parts à la place.

Si ItemName existe dans wp_quantum_sales ET IsActive = 1 ET wp_hunter_quote_parts n'a pas de ItemName dans le tableau, obtenir des données de vente de wp_quantum_sales, d'autre si ItemName existe en wp_hunter_quote_parts obtenir des données de hunter_quote_parts à la place.

Comment puis-je combiner la première et la seconde table, plutôt qu'une jointure externe avec une autre table?

Une autre tentative ici:

(SELECT IFNULL(qp.ItemName, qs.ItemName) AS name, IFNULL(qp.TimeAdded, qs.TimeAdded) AS created, qs.SalesDate AS effective, qp.VendorName AS supplier, qp.Source AS source, qp.VendorType AS type, qp.Price AS cost, qs.Price AS price, CAST((((CAST(qs.Price AS DECIMAL(10,2)) - CAST(qp.Price AS DECIMAL(10,2)))/CAST(qp.Price AS DECIMAL(10,2))) * 100) AS DECIMAL(10,2)) AS markup, qs.CustomerName AS customer, qs.CustomerListID AS customerListID, qp.VendorListID AS vendorListID, '' AS itemListID 
        FROM wp_quantum_purchases AS qp, wp_quantum_sales AS qs 
        WHERE (qp.IsActive = 1 OR qs.IsActive = 1) 
      AND NOT EXISTS (
       SELECT 1 
       FROM wp_hunter_quote_parts AS hqp 
       WHERE (qp.ItemName = hqp.ItemName || qs.ItemName = hqp.ItemName) AND hqp.IsActive = 1 
      ) 
       ) 
       UNION ALL 
      (SELECT hqp.ItemName AS name, hq.Quote_Date AS created, hqp.SalesDate AS effective, hqp.VendorName AS supplier, hqp.Source AS source, hqp.VendorType AS type, hqp.Cost AS cost, hqp.Price AS price, CAST((((CAST(hqp.Price AS DECIMAL(10,2)) - CAST(hqp.Cost AS DECIMAL(10,2)))/CAST(hqp.Cost AS DECIMAL(10,2))) * 100) AS DECIMAL(10,2)) AS markup, IFNULL(hq.Customer_FullName, 'N/A') AS customer, hq.Customer_ListID AS customerListID, hqp.VendorListID AS vendorListID, hqp.Item_ListID AS itemListID 
        FROM wp_hunter_quote_parts AS hqp 
        LEFT JOIN wp_hunter_quotes AS hq ON (hq.id = hqp.QuoteID) 
        WHERE (hqp.IsActive = 1)) 
      ORDER BY name ASC 

Figured celui-ci fonctionnerait, mais il semble qu'il ne cesse d'aller et aller et aller, et ne semble pas finir jamais la requête. Pas d'erreurs que je peux voir, mais ne finit jamais ... Et ces tables sont très petites, c'est étrange ...

Répondre

0

Je ne comprends pas complètement votre question, mais vous pourriez créer une vue de la deux premières tables, puis faites une jointure externe avec la troisième table.

+0

Vous ne savez pas exactement ce qu'est la création d'une vue. Fondamentalement, j'ai besoin de combiner les 2 premières tables en 1, que de faire une jointure externe sur la dernière table. Si la dernière table a IsActive = 1 où ItemName est trouvé, j'en ai besoin pour retourner ces données de tables à la place. Avoir du sens? –