【问题标题】:SQL Server many to many without primary key relationSQL Server 多对多没有主键关系
【发布时间】:2021-09-28 20:38:55
【问题描述】:

我遇到了 T-SQL 问题。该案例有两个表,期望从另一个表中左连接一行并连接不同的行以获得结果。

编辑案例: tabls

我的代码:

SELECT T1.ID,T2.BID,T2.FID,T3.FID,T3.PID,T4.PID,T4.Name,T5.FID
FROM T1
INNER JOIN T2 ON T2.BID = T1.ID
INNER JOIN T3 ON T3.FID = T2.FID
INNER JOIN T4 ON T4.PID = T3.PID
OUTER APPLY(SELECT TOP(1) T5.*,T3.PID FROM T5 INNER JOIN T3 ON T3.FID = T5.FID WHERE T5.BID = T2.BID AND T2.IsDone
 = 1 AND T3.PID = T3.PID ORDER BY NEWID()) T5

我希望 T5.FID 没有重复

我两次得到这个 T5.FID

result

有表格 DDL 和示例插入数据。

CREATE TABLE [dbo].[T1](
    [ID] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[T2](
    [BID] [int] NOT NULL,
    [FID] [int] NOT NULL,
    [IsDone] [bit] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[T3](
    [FID] [int] NOT NULL,
    [PID] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[T4](
    [PID] [int] NOT NULL,
    [Name] [varchar](50) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[T5](
    [FID] [int] NOT NULL,
    [BID] [int] NOT NULL
) ON [PRIMARY]
GO
INSERT [dbo].[T1] ([ID]) VALUES (1);
INSERT [dbo].[T1] ([ID]) VALUES (2);
INSERT [dbo].[T1] ([ID]) VALUES (3);
INSERT [dbo].[T1] ([ID]) VALUES (4);
INSERT [dbo].[T2] ([BID], [FID], [IsDone]) VALUES (1, 12, 1);
INSERT [dbo].[T2] ([BID], [FID], [IsDone]) VALUES (2, 13, 1);
INSERT [dbo].[T2] ([BID], [FID], [IsDone]) VALUES (2, 14, 1);
INSERT [dbo].[T2] ([BID], [FID], [IsDone]) VALUES (2, 15, 1);
INSERT [dbo].[T2] ([BID], [FID], [IsDone]) VALUES (2, 16, 0);
INSERT [dbo].[T2] ([BID], [FID], [IsDone]) VALUES (3, 17, 0);
INSERT [dbo].[T2] ([BID], [FID], [IsDone]) VALUES (4, 18, 0);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (12, 2);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (13, 3);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (14, 3);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (15, 3);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (16, 3);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (17, 4);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (18, 5);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (19, 3);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (20, 3);
INSERT [dbo].[T3] ([FID], [PID]) VALUES (21, 3);
INSERT [dbo].[T4] ([PID], [Name]) VALUES (2, N'A');
INSERT [dbo].[T4] ([PID], [Name]) VALUES (3, N'B');
INSERT [dbo].[T4] ([PID], [Name]) VALUES (4, N'C');
INSERT [dbo].[T4] ([PID], [Name]) VALUES (5, N'D');
INSERT [dbo].[T5] ([FID], [BID]) VALUES (19, 2);
INSERT [dbo].[T5] ([FID], [BID]) VALUES (20, 2);
INSERT [dbo].[T5] ([FID], [BID]) VALUES (21, 2);

【问题讨论】:

  • 请将示例数据和预期结果发布为文本而不是图像。最好在 DML 中,这样我们就可以轻松地重新创建它。
  • 为什么Table1 中有多个相同 行?这通常是设计缺陷的标志。
  • @Larnu 这是第二个开发项目,实际上有很多表,而不是两个表。我想使用左连接,结果不是同一行。
  • 看起来像 CSC540 作业。 :)
  • 所以在SOF中,“如何提出一个好问题”是非常重要的。首先,不要粘贴源代码的图像。没有人会手动输入图像中的所有文本。第二。创建明确的表 DDL 和示例插入数据。第三,做一个“我期望的”(数据行),而不仅仅是描述。这些是我的一些希望,可以提供帮助。

标签: sql-server tsql sql-server-2012


【解决方案1】:

看起来你可以只做DISTINCT,因为Table1 中的数据都完全相同

SELECT DISTINCT
       T1.AID,
       T1.[Name],
       T2.Property
FROM dbo.Table1 T1
     JOIN dbo.Table2 T2 ON T1.AID = T2.AID;

我个人认为,在一个表中包含多个完全相同的行通常意味着您有需要解决的数据问题。如果确实需要DELETE 重复,我建议看看How to delete duplicate rows in SQL Server?。然后你可以去掉昂贵的DISTINCT 操作符。

【讨论】:

  • 对不起,这个例子只是一个例子,实际上它很复杂,不是两个表,那么,如何使用join?
  • "如何使用 join" 这只是一个简单的INNER JOIN。如果你不懂JOINs,你需要学习语言,@Delevin,它们是语言的基础部分。
  • 对不起,我第一次放错了例子,耽误了大家,请见谅,现在更新。
猜你喜欢
  • 2013-07-08
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2012-03-22
相关资源
最近更新 更多