如何进行这种查询的实现

时间:2013-02-10 19:37:14

标签: sql sql-server

我的数据库表如下

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有关= vProductLanguage.kLanguage

表vProductLanguage与vProductLanguage.kLanguage = vLanguage.nid上的vLanguage有关

因此它的表vProductLanguage将具有正在选择的语言

行将如下图所示

Table vProduct

vProduct

Table vProductLanguage

vProductLanguage

Table vLanguage

vLanguage

我想要的是从表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中选择所有行。

希望我明白我的问题。

1 个答案:

答案 0 :(得分: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 with Demo