Asp.net 尝试联接三个表时,SQL查询不检索数据
这是我的ERD,因为我的数据库包含三个表: 我想从这个表中检索数据,所以我编写了以下查询:Asp.net 尝试联接三个表时,SQL查询不检索数据,asp.net,sql,database,sql-server-2008,Asp.net,Sql,Database,Sql Server 2008,这是我的ERD,因为我的数据库包含三个表: 我想从这个表中检索数据,所以我编写了以下查询: SELECT [SrvcDate], [Order].OrderID, [EmployeeID], [CustID], [ComputerID] FROM [Order], [OtherService], [ServiceOrder] WHERE [Order].[OrderID]=[OtherService].[OrderID] OR [Order].OrderID= [ServiceOrder].Or
SELECT [SrvcDate], [Order].OrderID, [EmployeeID], [CustID], [ComputerID]
FROM [Order], [OtherService], [ServiceOrder]
WHERE [Order].[OrderID]=[OtherService].[OrderID]
OR [Order].OrderID= [ServiceOrder].OrderID
但此查询仅在[OtherService]和[ServiceOrder]表都包含任何数据时返回数据。但如果其中一个表中没有数据,即使其他表包含一些数据,查询也不会检索数据
例如,假设我在[OtherService]表中有几条记录,但在[ServiceOrder]表中没有任何数据,这个查询应该会将[OtherService]表中的所有数据都带到正确的位置?但它不会检索任何记录,即使我在[OtherService]表中有记录。为什么会这样?您应该进行适当的显式连接,在本例中是外部连接。目前您正在执行隐式内部联接,因此它将只检索三个表上存在的行
SELECT [SrvcDate], O.OrderID, [EmployeeID], [CustID], [ComputerID]
FROM [Order] O
LEFT JOIN [OtherService] OS
ON O.[OrderID] = OS.[OrderID]
LEFT JOIN [ServiceOrder] SO
ON O.[OrderID] = So.OrderId
您应该进行适当的显式连接,在本例中是外部连接。目前您正在执行隐式内部联接,因此它将只检索三个表上存在的行
SELECT [SrvcDate], O.OrderID, [EmployeeID], [CustID], [ComputerID]
FROM [Order] O
LEFT JOIN [OtherService] OS
ON O.[OrderID] = OS.[OrderID]
LEFT JOIN [ServiceOrder] SO
ON O.[OrderID] = So.OrderId
查看。查看。停止使用旧式联接,请使用架构前缀。您的查询应该是:
SELECT o.[SrvcDate], o.OrderID, o.[EmployeeID], o.[CustID], o.[ComputerID]
--, I assume some columns from OtherService / ServiceOrder
FROM dbo.[Order] AS o
LEFT OUTER JOIN dbo.[OtherService] AS os
ON os.OrderID = o.OrderID
LEFT OUTER JOIN dbo.[ServiceOrder] AS so
ON so.OrderID = o.OrderID;
如果希望在OtherService或ServiceOrder中至少有一行,请添加:
WHERE COALESCE(os.OrderID, so.OrderID) IS NOT NULL
停止使用旧式联接,请使用架构前缀。您的查询应该是:
SELECT o.[SrvcDate], o.OrderID, o.[EmployeeID], o.[CustID], o.[ComputerID]
--, I assume some columns from OtherService / ServiceOrder
FROM dbo.[Order] AS o
LEFT OUTER JOIN dbo.[OtherService] AS os
ON os.OrderID = o.OrderID
LEFT OUTER JOIN dbo.[ServiceOrder] AS so
ON so.OrderID = o.OrderID;
如果希望在OtherService或ServiceOrder中至少有一行,请添加:
WHERE COALESCE(os.OrderID, so.OrderID) IS NOT NULL
由此产生的空值正在杀死你。我猜你想要的是:
SELECT [SrvcDate], [Order].OrderID, [EmployeeID], [CustID], [ComputerID]
FROM [Order]
LEFT JOIN [OtherService] ON [Order].[OrderID] = [OtherService].[OrderID]
LEFT JOIN [ServiceOrder] ON [Order].[OrderID] = [ServiceOrder].[OrderID]
WHERE [OtherService].[OrderID] IS NOT NULL
OR [ServiceOrder].[OrderID] IS NOT NULL
由此产生的空值正在杀死你。我猜你想要的是:
SELECT [SrvcDate], [Order].OrderID, [EmployeeID], [CustID], [ComputerID]
FROM [Order]
LEFT JOIN [OtherService] ON [Order].[OrderID] = [OtherService].[OrderID]
LEFT JOIN [ServiceOrder] ON [Order].[OrderID] = [ServiceOrder].[OrderID]
WHERE [OtherService].[OrderID] IS NOT NULL
OR [ServiceOrder].[OrderID] IS NOT NULL
是否要返回只有顺序数据的行,或者应该至少有一个OtherService或ServiceOrder中有数据?是否要返回只有顺序数据的行,或者应该至少有一个OtherService或ServiceOrder中有数据?+1因为where子句,OP似乎想要,但我肯定错了。是的,where子句就是我想要的。谢谢你+1,因为where子句看起来OP想要这个,但我肯定是错的。是的,where子句就是我想要的。谢谢。where子句解决了这个问题。谢谢。是的,where条款解决了这个问题。非常感谢。