【问题标题】:SQL query, search data and return project nameSQL查询、搜索数据并返回项目名称
【发布时间】:2013-06-13 06:59:44
【问题描述】:

您好,我正在寻找有关创建存储过程的帮助。 这是详细信息 我有一个名为Partners 的表,其中包含partner information (Columns, PartnerID and partnername) 我还有另一个名为ProjectPartners 的表,其中包含项目与合作伙伴columns( PPID, Partner1, partner2, partner3....partner25) 之间的链接,我还有一个名为ProjectDetails 的表,其中包含信息在columns( ProjectDID, Project) 项目上projectpartners 的外键在Projectdetails 内。

我正在寻找一个允许我输入partner name 的存储过程,然后显示它们包含在其中的项目。我已经有一些模拟代码,但它似乎不起作用。

@partnername nvarchar(50)
AS 
SET NOCOUNT ON;
SELECT ProjectDID, Project
FROM Projectdetails
WHERE Partners.PartnerName = @partnername

任何帮助将不胜感激

【问题讨论】:

  • 这种类型的经典设计是您的ProjectPartner 表应该有ProjectID 和一个PartnerID,然后与与该项目关联的多个合作伙伴您有多个ProjectPartner 行。这将使您的查询更容易。这就是为什么它是经典解决方案:-)

标签: sql sql-server tsql select stored-procedures


【解决方案1】:

您缺少通过表架构获取必要数据的连接。 阅读这篇关于 joins 的 MSDN 文章。

select ProjectDetails.ProjectDID, ProjectDetails.Project
from ProjectDetails
join ProjectPartners on ProjectPartners.ProjectDID = ProjectDetails.ProjectDID
join Partners on Partners.PartnerId  = ProjectPartners.PPID
where Partners.PartnerName = @partnerName

你还没有描述ProjectPartnersPartner之间的关系,所以我假设ProjectPartners上的PPID列就是关系

您还提到您的ProjectPartners 表有PPID, Partner1, partner2, partner3....partner25 列。您是否只计划拥有 25 个合作伙伴。如果你有 26 个,你会添加一个新列吗?你可能想解决这个问题。

同样在列命名约定中,有些有点混乱。 您在ProjectPartners 上有PPID。我想这意味着ProjectPartnersId。 在表ProjectDetails 上有ProjectDID 列。 这有点不一致。我想它应该是 PDID on ProjectDetailsProjectPID on ProjectPartners 就我个人而言,我一直偏爱简单的旧 Id 作为我的身份列。

更新:

根据您下面的 cmets,听起来您的表格可能存在一些根本性的问题:

create table Partners (
    Id int not null primary key identity,
    PartnerName nvarchar(100) not null)
go

create table ProjectDetails(
    Id int not null primary key identity,
    Project nvarchar(100) not null)
go


create table ProjectPartners (
PartnersId int not null,
    ProjectDetailsId int not null
)
go

alter table ProjectPartners add constraint FK_ProjectPartners_PartnersId_Partners_Id foreign key (PartnersId) references Partners(Id)
alter table ProjectPartners add constraint FK_ProjectPartners_ProjectDetailsId_ProjectDetails_Id foreign key (ProjectDetailsId) references ProjectDetails(Id)
go

我建议将您的数据库架构更改为根据上面提供的架构更灵活的架构。 这将通过在您每次有新合作伙伴时添加一个新列来防止ProjectPartners 表不断增长。

它将解决您的外键的所有问题,并使您的表格更直观。

这将产生 SQL:

select ProjectDetails.Project, ProjectDetails.Id
from ProjectDetails
join ProjectPartners on ProjectPartners.ProjectDetailsId = ProjectDetails.Id
join Partners on Partners.Id = ProjectPartners.PartnersId
where Partners.PartnerName= @partnerName

【讨论】:

  • 它们使用 Partners 表主键 PartnerID 链接,在 projectPartners 表中外键为 (Partner1, Partner2...partner 25)
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多