2016-04-13 12 views
0

Ben bir Oracle arka plandan geliyorum bu yüzden bu sitede arama yaparken LISTAGG() 'nin kehanette ne yapacağını çoğaltmaya çalışmak için FOR XML PATH'i kullanma konusunda sayısız örnek buldum. Ancak, yapmaya çalıştığım şeyin bu kapsam dışında olup olmadığını bilmiyorum ya da hangi parçayı kaçırdığımı anlayamıyorum. Bulduğum her örnek sadece tek bir anahtar kimliği kullanıyor ve benim durumumda birden fazla tablodan birleştirme kullanmam gerekiyor.SQL Server FOR XML dilimini kullanarak birleştirin

Tabloların nasıl göründüğüne dair düzen İşte.

CREATE TABLE driven_product 
([PRODUCT_ID] int, [DRIVER_ID] int, [DRIVER_PRODUCT_INPUT_NUM] int); 

INSERT INTO driven_product 
([PRODUCT_ID], [DRIVER_ID], [DRIVER_PRODUCT_INPUT_NUM]) 
VALUES (1, 2, 3); 

CREATE TABLE product_input 
([PRODUCT_ID] int, [PRODUCT_INPUT_NUM] int, [PRODUCT_VALUE_NUM] int, [COLOR] VARCHAR (50)); 

INSERT INTO product_input 
([PRODUCT_ID], [PRODUCT_INPUT_NUM], [PRODUCT_VALUE_NUM], [COLOR]) 
VALUES 
    (1, 3, 1, 'White'), 
    (1, 3, 2, 'Blue'), 
    (1, 3, 3, 'Green'), 
    (1, 3, 4, 'Yellow'), 
    (1, 3, 5, 'Orange'); 

CREATE TABLE driven_price 
[PRODUCT_ID] int, [DRIVER_ID] int, [PRODUCT_VALUE_NUM] int, [PRICE] int); 

INSERT INTO driven_price 
([PRODUCT_ID], [DRIVER_ID], [PRODUCT_VALUE_NUM], [PRICE]) 
VALUES 
    (1, 2, 1, 10), 
    (1, 2, 2, 10), 
    (1, 2, 3, 10), 
    (1, 2, 4, 20), 
    (1, 2, 5, 20); 

driven_product tablo driven_product.product_id = product_input.product_id VE driven_product.driver_product_input_num = product_input.product_input_num kullanarak product_input tabloya katılır. Driven_price tablosu, driven_product.product_id = driven_price.product_id, driven_product.driver_id = driven_price.driver_id ve product_input.product_value_num = driven_product.product_value_num kullanılarak birleştirilir.

ben aldık en yakın olan:

SELECT STUFF((SELECT '/' + color 
       FROM product_input pi 
       WHERE pi.product_id = dp.product_id 
       AND pi.product_input_num = dp.product_input_num 
       FOR XML PATH('')), 1, 1, ''), dpr.price 
FROM driven_product dp 
INNER JOIN driven_price dpr ON dp.product_id = dpr.product_id 
AND dp.driven_id = dpr.driven_id 

Bu, her fiyat içine tüm renkleri bir araya getirir.

Şimdi bariz olan şey, product_input.product_value_num öğesine driven_price.product_value_num öğesine katılmama olmasıdır. Bunu yaptığımda her rengi kendi satırına ayırır.

Bu yüzden mücadele ettiğim yer burası fiyatla yapmam gerekmesi. Bu yüzden ayrı olmak için "Beyaz, Mavi, Yeşil" ve "Sarı, Turuncu" olmalı.

Bunu SQLFiddle'a kurmaya çalıştım, ancak hata almaya devam ettim. Verebileceğiniz herhangi bir rehberlik takdir edilecektir.

cevap

1

Grupla ya da ayrı olarak kullanabilirsiniz .. ancak asıl sorununuz FOR FOR XML sorgunuzu PRICE ile filtrelemediniz, bu yüzden her rengi alıyorsunuz.

SELECT DISTINCT 
     Products = STUFF((
       SELECT '/' + color 
       FROM driven_price dp2 
         JOIN product_input pi ON dp2.Product_Value_Num = PI.Product_Value_Num 
       WHERE dp2.driver_id = dpr.driver_id AND dp2.Price = dp.Price 
       FOR XML PATH('')), 1, 1, ''), 
     dp.[Price] 
FROM driven_product dpr 
     JOIN product_input pri ON dpr.Driver_product_input_num = pri.PRODUCT_INPUT_NUM 
     JOIN driven_price dp ON pri.product_id = dp.product_id 
      AND pri.product_value_num = dp.product_value_num 
0

Dış sorguda bir toplama yapmanız gerekir. Bunun ne istediğinizi yapacak düşünüyorum :

SELECT dpr.price, 
     (SELECT '/' + pi.color 
     FROM product_input pi join 
      driven_product dp INNER JOIN 
      ON pi.product_id = dp.product_id AND 
       pi.product_input_num = dp.product_input_num 
     WHERE dp.product_id = dpr.product_id 
     FOR XML PATH('')) 
     ) 
FROM driven_price dpr 
GROUP BY dpr.price; 

Not: Yalnızca infix ayırıcılar işlemek için stuff() gerekir. "/ Mavi/yeşil/kırmızı" ile memnun iseniz, o zaman buna ihtiyacınız yoktur. stuff()'un amacı, önde gelen bir ayrılmış kaldırmaktır, bu nedenle, "mavi, yeşil, kırmızı", "mavi, yeşil, kırmızı" olur.

+0

Genellikle cevaplarınızı Bay Linoff seviyorum ama hiç çalışma olduğunu göremiyorum .. :( Everytime ı bir 'yanlış syntax' hatası alıyorum yanı çalıştırmayı deneyin. kadarıyla bunu değiştirme Yapabileceğim her iki fiyat için de her rengi iade etme problemini geri getiriyor. – Shaneis