我的数据库表如下
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
Table vProductLanguage
Table 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中选择所有行。
希望我明白我的问题。
答案 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
这将返回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