Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 尝试联接三个表时,SQL查询不检索数据_Asp.net_Sql_Database_Sql Server 2008 - Fatal编程技术网

Asp.net 尝试联接三个表时,SQL查询不检索数据

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

这是我的ERD,因为我的数据库包含三个表:

我想从这个表中检索数据,所以我编写了以下查询:

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条款解决了这个问题。非常感谢。