2017-08-11 80 views
0

我有一个引用三个表的查询。SQL加入查询返回空

的表格如下所示:

FORM_FACTOR

FORM_FACTOR_ID | FORM_FACTOR_DESCRIPTION 

AOF_ORDER_LINE_QUEUE

SO_LINE_NUMBER | FORM_FACTOR_ID 

AOF_ORDER_PARTS

SERIAL_NUMBER | SO_LINE_NUMBER 

想法是使用零件的SERIAL_NUMBER得到FORM_FACTOR_DESCRIPTION。我写了一个查询来做到这一点,但无论出于何种原因,它都返回null。我可以发誓这个查询正在工作,但显然有一个缺陷。帮助表示赞赏。

查询:

DECLARE @serial VARCHAR(50) 
SET @serial = 'somestring' 

SELECT 
    ff.[FORM_FACTOR_DESCRIPTION] 
FROM 
    [dbo].[FORM_FACTOR] AS ff 
JOIN 
    [dbo].[AOF_ORDER_LINE_QUEUE] AS lQ ON ff.[FORM_FACTOR_ID] = lQ.[FORM_FACTOR_ID] 
JOIN 
    [dbo].[AOF_ORDER_PARTS] AS oO ON oO.[SO_LINE_NUMBER] = lQ.[SO_LINE_NUMBER] 
WHERE 
    oO.[SERIAL_NUMBER] = @serial 
+4

它可能没有返回行,而不是'NULL'。最可能的原因是'WHERE'没有匹配。接下来最有可能的原因是'JOIN's没有匹配。 –

+0

您是否错过了第二行开头的SET或SELECT命令?换句话说,SET @serial ='something'; –

+0

在AOF_Order_parts中不存在@serial;或者它和so_Line_Number它关联doens不存在于lq.form_factor_ID中,或者它确实存在,但是form_Facotr_ID dof不存在于ff中。这似乎是一个数据问题而不是查询。 – xQbert

回答

0

不是一个真正的解决方案在这里。在这一点上它仍然是一个未解之谜。

但要寻找根本原因,也许你可以打开连接并使用左连接?
也许更容易发现连接在右侧返回NULL的位置。

在下面的例子中,我迷惑了COLLATION。 只是忽略并删除它,很可能它与它无关。

DECLARE @serial VARCHAR(50); 
SET @serial = 'EOXH2T100008' ; 

SELECT DB_NAME() as current_db, DATABASEPROPERTYEX(DB_NAME(), 'Collation') as db_collation; 
--#SQL_Latin1_General_CP1_CI_AS 
--SELECT Name, Description FROM fn_helpcollations() where name like '%Latin1%' ; 

declare @FORM_FACTOR table (FORM_FACTOR_ID int, FORM_FACTOR_DESCRIPTION varchar(30)); 
insert into @FORM_FACTOR (FORM_FACTOR_ID, FORM_FACTOR_DESCRIPTION) values (1,'test 1'),(2,'test 2'); 

declare @AOF_ORDER_LINE_QUEUE table (ORDER_LINE_QUEUE_ID int identity(1,1), FORM_FACTOR_ID int, SO_LINE_NUMBER int); 
insert into @AOF_ORDER_LINE_QUEUE (FORM_FACTOR_ID, SO_LINE_NUMBER) values (1,100),(3,100),(2,200); 

declare @AOF_ORDER_PARTS table (ORDER_PARTS_ID int identity(1,1), SO_LINE_NUMBER int, SERIAL_NUMBER VARCHAR(50) COLLATE SQL_Latin1_General_CP850_BIN); 
insert into @AOF_ORDER_PARTS (SO_LINE_NUMBER, SERIAL_NUMBER) values (100,'EOXH2T100008'),(200,'eOXH2T100008'); 

SELECT 
oO.ORDER_PARTS_ID, oO.SERIAL_NUMBER, oO.SO_LINE_NUMBER, 
lQ.ORDER_LINE_QUEUE_ID, lQ.FORM_FACTOR_ID, 
ff.FORM_FACTOR_DESCRIPTION 
FROM @AOF_ORDER_PARTS AS oO 
LEFT JOIN @AOF_ORDER_LINE_QUEUE AS lQ ON lQ.[SO_LINE_NUMBER] = oO.[SO_LINE_NUMBER] 
LEFT JOIN @FORM_FACTOR AS ff ON ff.[FORM_FACTOR_ID] = lQ.[FORM_FACTOR_ID] 
WHERE oO.[SERIAL_NUMBER] = @serial;