Birleştirilmiş tablolardan nasıl veri alabilirim?

3 masam var:

products table
--------------
id
name
...


categories table
----------------
id
name
...


product_categories table
------------------------
product_id
category_id

Ve bu sorgu ile onlara katılın:

select p.*
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id

Bu sorgu, o ürünün her kategorisi için bir ürünün birden fazla kaydını döndürür, ancak yalnızca bir ürün ve o ürünün birden fazla kategorisini almak istiyorum.

Bu benim çıktım:

p.Id  p.name --> cat_id cat_name

1 product_1 --> 1 cat1
1 product_1 --> 3 cat3
1 product_1 --> 2 cat2
1 product_1 --> 6 cat6 
2 product_2 --> 5 cat5
2 product_2 --> 1 cat1 
.
.
.

Ve istenen çıktı:

p.Id  p.name --> cat_id cat_name,cat_id cat_name,...

1 product_1 --> 1 cat1,3 cat3,2 cat2,6 cat6 
2 product_2 --> 5 cat5,1 cat1 
.
.
.

Bunu nasıl yapabilirim?

1
Bunu anlıyorum, ancak her kategori için bir sütuna sahip olmak yerine, ürün adını ve o ürüne ait tüm kategorilere sahip bir dize içeren başka bir sütunu döndürmekten memnun olur musunuz?
katma yazar sr28, kaynak
Bunu anlıyorum, ancak her kategori için bir sütuna sahip olmak yerine, ürün adını ve o ürüne ait tüm kategorilere sahip bir dize içeren başka bir sütunu döndürmekten memnun olur musunuz?
katma yazar sr28, kaynak
Bunu anlıyorum, ancak her kategori için bir sütuna sahip olmak yerine, ürün adını ve o ürüne ait tüm kategorilere sahip bir dize içeren başka bir sütunu döndürmekten memnun olur musunuz?
katma yazar sr28, kaynak
Örneğin, tüm kategorileri içeren bir dize döndürmekten memnun olur musunuz? "1 kedi 1, 3 kedi3, 6 kedi6"?
katma yazar sr28, kaynak
Örneğin, tüm kategorileri içeren bir dize döndürmekten memnun olur musunuz? "1 kedi 1, 3 kedi3, 6 kedi6"?
katma yazar sr28, kaynak
Örneğin, tüm kategorileri içeren bir dize döndürmekten memnun olur musunuz? "1 kedi 1, 3 kedi3, 6 kedi6"?
katma yazar sr28, kaynak
bir WHERE deyimi ekleyin. WHERE p.id =
katma yazar Felix Pamittan, kaynak
bir WHERE deyimi ekleyin. WHERE p.id =
katma yazar Felix Pamittan, kaynak
bir WHERE deyimi ekleyin. WHERE p.id =
katma yazar Felix Pamittan, kaynak
SELECT c. * ve bir WHERE yan tümcesi kullanın
katma yazar ughai, kaynak
SELECT c. * ve bir WHERE yan tümcesi kullanın
katma yazar ughai, kaynak
SELECT c. * ve bir WHERE yan tümcesi kullanın
katma yazar ughai, kaynak
Şimdi, örnek verilerle tablo yapısını sağlayın (sql kemanı yapmak için en iyisidir)
katma yazar Stanislovas Kalašnikovas, kaynak
Şimdi ve istediğiniz çıktı için çıktınızı sağlayın.
katma yazar Stanislovas Kalašnikovas, kaynak
Şimdi ve istediğiniz çıktı için çıktınızı sağlayın.
katma yazar Stanislovas Kalašnikovas, kaynak
Şimdi ve istediğiniz çıktı için çıktınızı sağlayın.
katma yazar Stanislovas Kalašnikovas, kaynak
Şimdi, örnek verilerle tablo yapısını sağlayın (sql kemanı yapmak için en iyisidir)
katma yazar Stanislovas Kalašnikovas, kaynak
İstediğiniz çıkış adresini burada gösterin. se daha iyi anlayacağız
katma yazar Ameya Deshpande, kaynak
@AmeyaDeshpande Bunun gibi bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@ StanislovasKalašnikovas sqlfiddle
katma yazar Mike, kaynak
@ sr28 Bir ürüne ait tüm kategoriler.
katma yazar Mike, kaynak
@wewesthemenace Bunun gibi bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@ StanislovasKalašnikovas Sorumu değiştirdim.
katma yazar Mike, kaynak
@ StanislovasKalašnikovas Sorumu değiştirdim.
katma yazar Mike, kaynak
@ StanislovasKalašnikovas Sorumu değiştirdim.
katma yazar Mike, kaynak
@wewesthemenace Bunun gibi bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@ughai Buna benzer bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@ughai Buna benzer bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@ sr28 Bir ürüne ait tüm kategoriler.
katma yazar Mike, kaynak
@ sr28 Bir ürüne ait tüm kategoriler.
katma yazar Mike, kaynak
@ sr28 Evet, ancak ürün kayıtlarının artıklığını istemiyorum: sqlfiddle
katma yazar Mike, kaynak
@ughai Buna benzer bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@AmeyaDeshpande Bunun gibi bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@AmeyaDeshpande Bunun gibi bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@ StanislovasKalašnikovas sqlfiddle
katma yazar Mike, kaynak
@ StanislovasKalašnikovas sqlfiddle
katma yazar Mike, kaynak
@wewesthemenace Bunun gibi bir sonuç istiyorum: code 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
katma yazar Mike, kaynak
@ sr28 Evet, ancak ürün kayıtlarının artıklığını istemiyorum: sqlfiddle
katma yazar Mike, kaynak
@ sr28 Evet, ancak ürün kayıtlarının artıklığını istemiyorum: sqlfiddle
katma yazar Mike, kaynak

8 cevap

Kimlik belirtmek için WHERE yan tümcesini eklemelisiniz ve seçme yan tümcesinde tüm verileri almak için p. * yerine c. * kullanmak isteyebilirsiniz. kategorilerden.

select p.name, c.*  
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id
where p.id = --smth
4
katma
OP'nin kategorilerden veri ihtiyacı var
katma yazar ughai, kaynak
@Mike, p.name seç, c. * 'ı deneyebilir, kategorideki ürün ve her şeyin düzenlenmiş yanıtını alabilirsiniz.
katma yazar Stanislovas Kalašnikovas, kaynak
@Stanislovas Kalašnikovas Bir ürün ve tüm kategorilerini almak istiyorum
katma yazar Mike, kaynak

Kimlik belirtmek için WHERE yan tümcesini eklemelisiniz ve seçme yan tümcesinde tüm verileri almak için p. * yerine c. * kullanmak isteyebilirsiniz. kategorilerden.

select p.name, c.*  
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id
where p.id = --smth
4
katma
OP'nin kategorilerden veri ihtiyacı var
katma yazar ughai, kaynak
@Mike, p.name seç, c. * 'ı deneyebilir, kategorideki ürün ve her şeyin düzenlenmiş yanıtını alabilirsiniz.
katma yazar Stanislovas Kalašnikovas, kaynak
@Stanislovas Kalašnikovas Bir ürün ve tüm kategorilerini almak istiyorum
katma yazar Mike, kaynak

Kimlik belirtmek için WHERE yan tümcesini eklemelisiniz ve seçme yan tümcesinde tüm verileri almak için p. * yerine c. * kullanmak isteyebilirsiniz. kategorilerden.

select p.name, c.*  
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id
where p.id = --smth
4
katma
OP'nin kategorilerden veri ihtiyacı var
katma yazar ughai, kaynak
@Mike, p.name seç, c. * 'ı deneyebilir, kategorideki ürün ve her şeyin düzenlenmiş yanıtını alabilirsiniz.
katma yazar Stanislovas Kalašnikovas, kaynak
@Stanislovas Kalašnikovas Bir ürün ve tüm kategorilerini almak istiyorum
katma yazar Mike, kaynak
SELECT        Tbl_Emp.EMPId, Tbl_Customer.First_Name, Tbl_Mail_IDs.MailId
FROM          Tbl_Emp INNER JOIN
      Tbl_Mail_IDs ON Tbl_Emp.EMPId = Tbl_Mail_IDs.Id INNER     
JOIN
      Tbl_Customer ON Tbl_Mail_IDs.Id = Tbl_Customer.Customer_Id
1
katma
Genellikle yalnızca kod yanıtlarından kaçının. Kodunuzu açıklamaya yardımcı olacak bir açıklaması eklemeyi düşünün. Teşekkürler
katma yazar MickyD, kaynak
SELECT        Tbl_Emp.EMPId, Tbl_Customer.First_Name, Tbl_Mail_IDs.MailId
FROM          Tbl_Emp INNER JOIN
      Tbl_Mail_IDs ON Tbl_Emp.EMPId = Tbl_Mail_IDs.Id INNER     
JOIN
      Tbl_Customer ON Tbl_Mail_IDs.Id = Tbl_Customer.Customer_Id
1
katma
Genellikle yalnızca kod yanıtlarından kaçının. Kodunuzu açıklamaya yardımcı olacak bir açıklaması eklemeyi düşünün. Teşekkürler
katma yazar MickyD, kaynak
SELECT        Tbl_Emp.EMPId, Tbl_Customer.First_Name, Tbl_Mail_IDs.MailId
FROM          Tbl_Emp INNER JOIN
      Tbl_Mail_IDs ON Tbl_Emp.EMPId = Tbl_Mail_IDs.Id INNER     
JOIN
      Tbl_Customer ON Tbl_Mail_IDs.Id = Tbl_Customer.Customer_Id
1
katma
Genellikle yalnızca kod yanıtlarından kaçının. Kodunuzu açıklamaya yardımcı olacak bir açıklaması eklemeyi düşünün. Teşekkürler
katma yazar MickyD, kaynak

Ürün kayıtlarının fazlalığını istemiyorsanız, başka bir deyişle, yalnızca kategori bilgilerini ve başka hiçbir şeyi istemiyorsanız, ilk önce ana ürünler tablosuna katılmanız gerekmez (kullandığınız varsayılarak ürün kimliği).

Bununla birlikte, sizin probleminiz, her olası kategori için bir sütun görüntülemeyi planlamıyorsanız ve ürünün içerip içermediğini kontrol etmiyorsanız, o zaman etrafta bir çalışma yapmanız gerekecek. Tercih edilen yaklaşımım, her satırdan geçen ve verilen bir ürün kimliği için kategorileri tek bir dizgeye çeken ve bu dizgiyi yeni bir tabloya (ürün kimliği, kategoriler) alan bir imleç oluşturmak olacaktır.

DECLARE @productId int
DECLARE @prevProductId int
SET @prevProductId = 0
DECLARE @cid int
DECLARE @cname nvarchar(255)
DECLARE @categoryList nvarchar(max)
SET @categoryList = ''

DECLARE @ProdCatTable TABLE
(
    ProductId int,
    Categories nvarchar(max)
)

DECLARE category_cursor CURSOR FOR
SELECT pc.product_id, c.id, c.name
FROM categories c
JOIN product_categories pc
ON pc.category_id = c.id
ORDER BY pc.product_id

OPEN category_cursor

FETCH NEXT FROM category_cursor
INTO @productId, @cid, @cname

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @prevProductId = 0
    BEGIN
        SET @categoryList = @cid + ' ' + @cname
        SET @prevProductId = @productId
    END
    ELSE IF (@prevProductId <> @productId) AND @categoryList <> ''
         INSERT INTO @ProdCatTable (ProductId, Categories)
         VALUES (@prevProductId, @categoryList)
         SET @prevProductId = @ProductId
         SET @categoryList = ''
    ELSE
    BEGIN
        SET @categoryList = @categoryList + ', ' + @cid + ' ' + @cname
    END

    FETCH NEXT FROM category_cursor
    INTO @productId, @cid, @cname
END

CLOSE category_cursor
DEALLOCATE category_cursor

SELECT ProductId, Catgories
FROM @ProdCatTable

NOTE: This hasn't been tested, but I think it should work if you're happy to return a table with the product id as your identify and the categories as a string.

0
katma
@Mike - Yukarıdaki yorumdan sonra, hiçbir şekilde bunun için düzenli bir çözüm olma ihtimali yoktur. Belki sadece 10 kategoriniz varsa, ikinci paragrafımda önerilen rotadan aşağıya inmek daha iyi olabilir, bu hala çok iyi değil ama daha iyi performans gösterebilir.
katma yazar sr28, kaynak
Dediğim gibi, test etmedim. Yalnızca tabloları okumak için okuyorsanız, hızlı ileri sarma imleci daha iyi olabilir.
katma yazar sr28, kaynak
Cevabınız için teşekkür ederim. Bu, bu senaryo için en iyi ve en iyi cevap mı? Her ürünü kategorileri ile göstermek istiyorum.
katma yazar Mike, kaynak

Ürün kayıtlarının fazlalığını istemiyorsanız, başka bir deyişle, yalnızca kategori bilgilerini ve başka hiçbir şeyi istemiyorsanız, ilk önce ana ürünler tablosuna katılmanız gerekmez (kullandığınız varsayılarak ürün kimliği).

Bununla birlikte, sizin probleminiz, her olası kategori için bir sütun görüntülemeyi planlamıyorsanız ve ürünün içerip içermediğini kontrol etmiyorsanız, o zaman etrafta bir çalışma yapmanız gerekecek. Tercih edilen yaklaşımım, her satırdan geçen ve verilen bir ürün kimliği için kategorileri tek bir dizgeye çeken ve bu dizgiyi yeni bir tabloya (ürün kimliği, kategoriler) alan bir imleç oluşturmak olacaktır.

DECLARE @productId int
DECLARE @prevProductId int
SET @prevProductId = 0
DECLARE @cid int
DECLARE @cname nvarchar(255)
DECLARE @categoryList nvarchar(max)
SET @categoryList = ''

DECLARE @ProdCatTable TABLE
(
    ProductId int,
    Categories nvarchar(max)
)

DECLARE category_cursor CURSOR FOR
SELECT pc.product_id, c.id, c.name
FROM categories c
JOIN product_categories pc
ON pc.category_id = c.id
ORDER BY pc.product_id

OPEN category_cursor

FETCH NEXT FROM category_cursor
INTO @productId, @cid, @cname

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @prevProductId = 0
    BEGIN
        SET @categoryList = @cid + ' ' + @cname
        SET @prevProductId = @productId
    END
    ELSE IF (@prevProductId <> @productId) AND @categoryList <> ''
         INSERT INTO @ProdCatTable (ProductId, Categories)
         VALUES (@prevProductId, @categoryList)
         SET @prevProductId = @ProductId
         SET @categoryList = ''
    ELSE
    BEGIN
        SET @categoryList = @categoryList + ', ' + @cid + ' ' + @cname
    END

    FETCH NEXT FROM category_cursor
    INTO @productId, @cid, @cname
END

CLOSE category_cursor
DEALLOCATE category_cursor

SELECT ProductId, Catgories
FROM @ProdCatTable

NOTE: This hasn't been tested, but I think it should work if you're happy to return a table with the product id as your identify and the categories as a string.

0
katma
@Mike - Yukarıdaki yorumdan sonra, hiçbir şekilde bunun için düzenli bir çözüm olma ihtimali yoktur. Belki sadece 10 kategoriniz varsa, ikinci paragrafımda önerilen rotadan aşağıya inmek daha iyi olabilir, bu hala çok iyi değil ama daha iyi performans gösterebilir.
katma yazar sr28, kaynak
Dediğim gibi, test etmedim. Yalnızca tabloları okumak için okuyorsanız, hızlı ileri sarma imleci daha iyi olabilir.
katma yazar sr28, kaynak
Cevabınız için teşekkür ederim. Bu, bu senaryo için en iyi ve en iyi cevap mı? Her ürünü kategorileri ile göstermek istiyorum.
katma yazar Mike, kaynak