0

私のデータベーステーブルは次のとおりです

CREATE TABLE [dbo].[vProduct](
[nId] [int] NOT NULL, //Primary key
[sName] [varchar](255) NULL

  )

CREATE TABLE [dbo].[vProductLanguage](
[kProduct] [int] NOT NULL,
[kLanguage] [int] NOT NULL  //Foriegn key to table vLanguage
 ) 


CREATE TABLE [dbo].[vLanguage](
[nId] [int] NOT NULL, //Primary key
[sName] [varchar](50) NULL,
[language] [char](2) NULL
  )

テーブル vProduct は、vProduct.nId = vProductLanguage.kLanguage で vProductLanguage と関係があります。

テーブル vProductLanguage は vProductLanguage.kLanguage = vLanguage.nid の vLanguage と関係があります

したがって、同様のテーブル vProductLanguage には、選択されている言語が含まれます

行は下の画像のようになります

Table vProduct

v製品

Table vProductLanguage

vProductLanguage

Table vLanguage

v言語

私が欲しいのは、テーブル vLanguage からすべての言語を選択し、テーブル vProductLanguage から選択した言語を選択することです。これはテーブル vProduct に関連付けられます。以下のクエリを試しましたが、製品に関連付けられている言語のみが返されます。

select * from 
      vProductLanguage 
           left join vLanguage on vProductLanguage.kLanguage = vLanguage.nId
       left join vProduct on vProductLanguage.kProduct = vProduct.nId
Where vProduct.nId = 1

テーブル vLanguage とテーブル vProductLanguage からすべての行を選択したいと考えています。

私の質問を明確にしたことを願っています。

4

1 に答える 1

1

JOIN最初にvLanguageテーブルから始めたいようです:

select *
from vLanguage l
left join vProductLanguage pl
  on l.nid = pl.kLanguage
left join vProduct p
  on pl.kProduct = p.nid
  and p.nid = 1

SQL Fiddle with Demoを参照してください。

vLanguageこれにより、テーブルのすべての行と、テーブルの一致する行が返されvProductLanguageます。.

複数ある場合はvProduct、クエリを次のように少し書き直すことができます。

select *
from vLanguage l
left join
(
  select pl.kLanguage, 
    p.nid,
    p.sName
  from vProductLanguage pl
  left join vProduct p
    on pl.kProduct = p.nid
  where p.nid = 1
) p
  on l.nid = p.kLanguage

デモで SQL Fiddle を参照してください

于 2013-02-10T19:44:27.227 に答える