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 回答