这是我的数据库的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]表中有记录,它也不会检索任何记录。那是为什么?
答案 0 :(得分:4)
停止使用旧式连接,请使用架构前缀。您的查询应该是:
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
答案 1 :(得分:3)
您应该进行适当的显式连接,在本例中为外连接。目前,您正在进行隐式内部联接,因此它只会检索三个表中存在的行。
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
答案 2 :(得分:1)
答案 3 :(得分:1)
由此产生的空值会杀死你。我的猜测是你想要的东西:
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