結合テーブルからデータを取得する方法を教えてください。

私は3つのテーブルがあります。

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


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


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

そして、このクエリでそれらを結合します:

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

このクエリは、その商品の各カテゴリごとに商品の複数のレコードを返しますが、1つの商品とその商品の複数のカテゴリのみを取得する必要があります。

これは私の出力です:

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 
.
.
.

そして望ましい出力:

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 
.
.
.

どうやってやるの?

1
私は理解していますが、各カテゴリの列を持つのではなく、商品名とその商品のすべてのカテゴリを含む文字列を含む別の列を返してもいいですか。
追加された 著者 sr28,
私は理解していますが、各カテゴリの列を持つのではなく、商品名とその商品のすべてのカテゴリを含む文字列を含む別の列を返してもいいですか。
追加された 著者 sr28,
私は理解していますが、各カテゴリの列を持つのではなく、商品名とその商品のすべてのカテゴリを含む文字列を含む別の列を返してもいいですか。
追加された 著者 sr28,
すべてのカテゴリを含む文字列を返すことに満足していますか。 "1 cat1、3 cat3、6 cat6"?
追加された 著者 sr28,
すべてのカテゴリを含む文字列を返すことに満足していますか。 "1 cat1、3 cat3、6 cat6"?
追加された 著者 sr28,
すべてのカテゴリを含む文字列を返すことに満足していますか。 "1 cat1、3 cat3、6 cat6"?
追加された 著者 sr28,
WHERE 句を追加します。 WHERE p.id =
追加された 著者 Felix Pamittan,
WHERE 句を追加します。 WHERE p.id =
追加された 著者 Felix Pamittan,
WHERE 句を追加します。 WHERE p.id =
追加された 著者 Felix Pamittan,
SELECT c。* を使用して WHERE 句を使用する
追加された 著者 ughai,
SELECT c。* を使用して WHERE 句を使用する
追加された 著者 ughai,
SELECT c。* を使用して WHERE 句を使用する
追加された 著者 ughai,
そのため、サンプルデータを含むテーブル構造を提供します(SQLをいじるのに最適)
追加された 著者 Stanislovas Kalašnikovas,
今のところあなたの出力と希望の出力を提供してください。
追加された 著者 Stanislovas Kalašnikovas,
今のところあなたの出力と希望の出力を提供してください。
追加された 著者 Stanislovas Kalašnikovas,
今のところあなたの出力と希望の出力を提供してください。
追加された 著者 Stanislovas Kalašnikovas,
そのため、サンプルデータを含むテーブル構造を提供します(SQLをいじるのに最適)
追加された 著者 Stanislovas Kalašnikovas,
何を出力したいのですか。それで私達はもっとよく理解するでしょう
追加された 著者 Ameya Deshpande,
@AmeyaDeshpandeこのような結果が欲しいのですが: code 1 product_1 cat1、cat3、cat2、cat6 | 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@StanislovasKalašnikovas sqlfiddle
追加された 著者 Mike,
@ sr28その製品のすべてのカテゴリ。
追加された 著者 Mike,
@wewesthemenaceこのような結果が欲しいのですが。 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@StanislovasKalašnikovas質問を編集しました。
追加された 著者 Mike,
@StanislovasKalašnikovas質問を編集しました。
追加された 著者 Mike,
@StanislovasKalašnikovas質問を編集しました。
追加された 著者 Mike,
@wewesthemenaceこのような結果が欲しいのですが。 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@ughai私はこのような結果が欲しいのですが: code 1 product_1 cat1、cat3、cat2、cat6 | 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@ughai私はこのような結果が欲しいのですが: code 1 product_1 cat1、cat3、cat2、cat6 | 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@ sr28その製品のすべてのカテゴリ。
追加された 著者 Mike,
@ sr28その製品のすべてのカテゴリ。
追加された 著者 Mike,
@ sr28はい、できますが、商品レコードの冗長性は不要です。 sqlfiddle
追加された 著者 Mike,
@ughai私はこのような結果が欲しいのですが: code 1 product_1 cat1、cat3、cat2、cat6 | 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@AmeyaDeshpandeこのような結果が欲しいのですが: code 1 product_1 cat1、cat3、cat2、cat6 | 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@AmeyaDeshpandeこのような結果が欲しいのですが: code 1 product_1 cat1、cat3、cat2、cat6 | 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@StanislovasKalašnikovas sqlfiddle
追加された 著者 Mike,
@StanislovasKalašnikovas sqlfiddle
追加された 著者 Mike,
@wewesthemenaceこのような結果が欲しいのですが。 2 product_2 cat5、cat1 | ...
追加された 著者 Mike,
@ sr28はい、できますが、商品レコードの冗長性は不要です。 sqlfiddle
追加された 著者 Mike,
@ sr28はい、できますが、商品レコードの冗長性は不要です。 sqlfiddle
追加された 著者 Mike,

8 答え

IDを指定するには WHERE 句を追加し、select句ではすべてのデータを取得するために p。* の代わりに c。* を使用することをお勧めします。カテゴリから。

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
追加された
OPにもカテゴリからのデータが必要です
追加された 著者 ughai,
@Mikeあなたは select p.name、c。* を試して、商品の名前とカテゴリーからすべてを取得し、回答を編集できます。
追加された 著者 Stanislovas Kalašnikovas,
@StanislovasKalašnikovas製品とそのすべてのカテゴリを入手したいです。
追加された 著者 Mike,

IDを指定するには WHERE 句を追加し、select句ではすべてのデータを取得するために p。* の代わりに c。* を使用することをお勧めします。カテゴリから。

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
追加された
OPにもカテゴリからのデータが必要です
追加された 著者 ughai,
@Mikeあなたは select p.name、c。* を試して、商品の名前とカテゴリーからすべてを取得し、回答を編集できます。
追加された 著者 Stanislovas Kalašnikovas,
@StanislovasKalašnikovas製品とそのすべてのカテゴリを入手したいです。
追加された 著者 Mike,

IDを指定するには WHERE 句を追加し、select句ではすべてのデータを取得するために p。* の代わりに c。* を使用することをお勧めします。カテゴリから。

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
追加された
OPにもカテゴリからのデータが必要です
追加された 著者 ughai,
@Mikeあなたは select p.name、c。* を試して、商品の名前とカテゴリーからすべてを取得し、回答を編集できます。
追加された 著者 Stanislovas Kalašnikovas,
@StanislovasKalašnikovas製品とそのすべてのカテゴリを入手したいです。
追加された 著者 Mike,
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
追加された
一般にコードのみの回答は避けてください。コードの説明に役立つ description を追加することを検討してください。ありがとう
追加された 著者 MickyD,
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
追加された
一般にコードのみの回答は避けてください。コードの説明に役立つ description を追加することを検討してください。ありがとう
追加された 著者 MickyD,
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
追加された
一般にコードのみの回答は避けてください。コードの説明に役立つ description を追加することを検討してください。ありがとう
追加された 著者 MickyD,

商品レコードの冗長性が必要ない場合、つまりカテゴリ情報だけが必要で、それ以外には必要ない場合は、最初にメインの商品テーブルに結合する必要はありません(製品番号)。

ただし、考えられるすべてのカテゴリの列を表示することを計画していない限り、製品にその列が表示されているかどうかにかかわらず、回避策を講じる必要があります。私の推奨するアプローチは、各行を走り、与えられた商品IDのカテゴリーを単一の文字列に引っ張り、この文字列を新しいテーブル(商品ID、カテゴリー)に入れるカーソルを作成することです。

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
追加された
@Mike - 上記のコメントに続いて、これに対するきちんとした解決策はありそうもない。あなたがたぶん10のカテゴリーしか持っていなかったならば、それは私の第二段落で提案されたルートをたどることがより良いかもしれません、それはまだあまり良くないけれどもよりよく実行するかもしれません。
追加された 著者 sr28,
私が言うように、私はそれをテストしていません。テーブルの読み取り専用のみを実行している場合は、おそらく早送りカーソルの方が良いでしょう。
追加された 著者 sr28,
ご回答ありがとうございます。これは、このシナリオに対する最善かつ最適化された答えですか?各商品をそのカテゴリとともに表示します。
追加された 著者 Mike,

商品レコードの冗長性が必要ない場合、つまりカテゴリ情報だけが必要で、それ以外には必要ない場合は、最初にメインの商品テーブルに結合する必要はありません(製品番号)。

ただし、考えられるすべてのカテゴリの列を表示することを計画していない限り、製品にその列が表示されているかどうかにかかわらず、回避策を講じる必要があります。私の推奨するアプローチは、各行を走り、与えられた商品IDのカテゴリーを単一の文字列に引っ張り、この文字列を新しいテーブル(商品ID、カテゴリー)に入れるカーソルを作成することです。

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
追加された
@Mike - 上記のコメントに続いて、これに対するきちんとした解決策はありそうもない。あなたがたぶん10のカテゴリーしか持っていなかったならば、それは私の第二段落で提案されたルートをたどることがより良いかもしれません、それはまだあまり良くないけれどもよりよく実行するかもしれません。
追加された 著者 sr28,
私が言うように、私はそれをテストしていません。テーブルの読み取り専用のみを実行している場合は、おそらく早送りカーソルの方が良いでしょう。
追加された 著者 sr28,
ご回答ありがとうございます。これは、このシナリオに対する最善かつ最適化された答えですか?各商品をそのカテゴリとともに表示します。
追加された 著者 Mike,