SQL Server联接不返回任何行
所以我的数据库中有这样的情况:SQL Server联接不返回任何行,sql,sql-server,tsql,Sql,Sql Server,Tsql,所以我的数据库中有这样的情况: SELECT A.No_ as itemno,A.Description as description from [dbo].[PRUEBAS$Item] A WHERE (A.No_ LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI or A.Description LIKE '%020212601%' COLLATE Modern_Spanish_100_CI_AI); 仅返回一行 +--------
SELECT A.No_ as itemno,A.Description as description from
[dbo].[PRUEBAS$Item] A
WHERE (A.No_ LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI
or A.Description LIKE '%020212601%' COLLATE Modern_Spanish_100_CI_AI);
仅返回一行
+-----------+-------------+
| itemno | description |
+-----------+-------------+
| 020212601 | BLA BLA |
+-----------+-------------+
我的第二个表返回以下内容:
select * from [dbo].[PRUEBAS$Item Cross Reference] B
where B.[Item No_] LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI ;
+-----------+----------------------+---------------------+--+
| Item No_ | Cross-Reference Type | Cross-Reference No_ | |
+-----------+----------------------+---------------------+--+
| 020212601 | 2 | | |
| 020212601 | 2 | 020212601 | |
| 020212601 | 2 | | |
| 020212601 | 2 | 020212601 | |
+-----------+----------------------+---------------------+--+
现在我加入两个表:
select A.No_ as itemno,A.Description as description, A.[Producto M3] as m3item from
[dbo].[PRUEBAS$Item] A left outer join [dbo].[PRUEBAS$Item Cross Reference] B
on A.No_ = B.[Item No_]
WHERE (A.No_ LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI
or A.Description LIKE '%020212601%' COLLATE Modern_Spanish_100_CI_AI
or B.[Cross-Reference No_] LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI)
我得到:
+-----------+-------------+--------+
| itemno | description | m3item |
+-----------+-------------+--------+
| 020212601 | BLA BLA | 0 |
| 020212601 | BLA BLA | 0 |
| 020212601 | BLA BLA | 0 |
| 020212601 | BLA BLA | 0 |
+-----------+-------------+--------+
这意味着,我的相关表有4行
我要做的下一件事是在WHERE子句中添加一个过滤器,因为我不希望第二个表中有一些数据:
select A.No_ as itemno,A.Description as description, A.[Producto M3] as m3item from
[dbo].[PRUEBAS$Item] A left outer join [dbo].[PRUEBAS$Item Cross Reference] B
on A.No_ = B.[Item No_]
WHERE (A.No_ LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI
or A.Description LIKE '%020212601%' COLLATE Modern_Spanish_100_CI_AI
or B.[Cross-Reference No_] LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI)
and (B.[Cross-Reference Type] = 3)
这根本不返回任何行!我希望得到一行,因为我使用的是左外连接
我错过了什么?我需要获取一行,即使第二个表中没有记录尝试将连接本身的
WHERE
子句中第二个表的限制移动到on
子句中:
SELECT
A.No_ AS itemno,
A.Description AS description,
A.[Producto M3] AS m3item
FROM [dbo].[PRUEBAS$Item] A
LEFT JOIN [dbo].[PRUEBAS$Item Cross Reference] B
ON A.No_ = B.[Item No_] AND
B.[Cross-Reference No_] LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI
WHERE
(A.No_ LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI OR
A.Description LIKE '%020212601%' COLLATE Modern_Spanish_100_CI_AI) AND
[Cross-Reference Type] = 3;
当前查询的问题是,
WHERE
子句中出现的对第二个表的限制可能会导致在查询完成之前过早地过滤掉不匹配的记录。上述建议应该可以解决这个问题。我相信您需要的查询是:
select A.No_ as itemno,A.Description as description, A.[Producto M3] as m3item
from [dbo].[PRUEBAS$Item] A left outer join
[dbo].[PRUEBAS$Item Cross Reference] B
on A.No_ = B.[Item No_] and
B.[Cross-Reference Type] = 3
WHERE (A.No_ LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI) or
(A.Description LIKE '%020212601%' COLLATE Modern_Spanish_100_CI_AI) or
(B.[Cross-Reference No_] LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI) ;
第二张桌子上的情况很复杂。条件
=3
需要进入on
子句,因为它引用了所有行。另一个条件作为或条件的一部分是可选的,因此它可以保留在WHERE
子句中。遗憾的是,您的数据示例没有提供所有需要的列,并且您没有提供所需的DDL。尽管如此,原始查询中仍有引用左联接表的筛选谓词
虽然您可能期望有一行,但我相信将别名B上的谓词移动到联接中会得到2或4行
项目编号|说明| M3项目|项目|编号|交叉参考|类型|交叉参考|编号|交叉参考类型
:-------- | :---------- | :----- | :-------- | ------------------: | :----------------- | -------------------:
02012601 | BLA BLA | null | 02012601 | 2 | null | 3
02012601 | BLA BLA | null | 02012601 | 2 | 02012601 | 3
02012601 | BLA BLA | null | 02012601 | 2 | null | 3
02012601 | BLA BLA | null | 02012601 | 2 | 02012601 | 3
小提琴
并非所有列名都与您的原始列名完全一致(空格是一个难题!),(B.[交叉引用类型]=3)
正在将您的左连接
强制为内部连接
,因为B.[交叉引用类型]也可以为空。因此,是否有任何解决方法使其像外部连接一样工作?如果[Cross Reference Type]为空?如果他添加且([Cross Reference Type]=3或[Cross Reference Type]为空)该怎么办?@WernerWaage否,不一定。如果我不考虑NULL
的情况,可能会导致结果集中的某些记录在所有B
表列中都有NULL
值,但这种省略不应导致任何记录被过滤掉。在我的情况下,这两个选项都不会返回任何行:将限制移动到ON子句and“或[Cross Reference Type]为NULL”的确如此!只需将“=3”筛选器移动到ON子句即可。谢谢!
CREATE TABLE PRUEBAS$Item(
No_ varchar(20) NOT NULL
,description VARCHAR(13) NOT NULL
,[Producto M3] VARCHAR(30)
);
INSERT INTO PRUEBAS$Item(No_,description) VALUES ('020212601','BLA BLA');
CREATE TABLE [PRUEBAS$Item Cross Reference](
Item_No_ varchar(20) NOT NULL
,CrossReference_Type INTEGER NOT NULL
,CrossReference_No_ varchar(20)
,[Cross-Reference Type] INTEGER
);
INSERT INTO [PRUEBAS$Item Cross Reference](Item_No_,CrossReference_Type,CrossReference_No_,[Cross-Reference Type]) VALUES ('020212601',2,NULL,3);
INSERT INTO [PRUEBAS$Item Cross Reference](Item_No_,CrossReference_Type,CrossReference_No_,[Cross-Reference Type]) VALUES ('020212601',2,'020212601',3);
INSERT INTO [PRUEBAS$Item Cross Reference](Item_No_,CrossReference_Type,CrossReference_No_,[Cross-Reference Type]) VALUES ('020212601',2,NULL,3);
INSERT INTO [PRUEBAS$Item Cross Reference](Item_No_,CrossReference_Type,CrossReference_No_,[Cross-Reference Type]) VALUES ('020212601',2,'020212601',3);
SELECT
A.No_ AS itemno
, A.Description AS description
, A.[Producto M3] AS m3item
, b.*
FROM [dbo].[PRUEBAS$Item] A
LEFT OUTER JOIN [dbo].[PRUEBAS$Item Cross Reference] B ON A.No_ = B.[Item_No_]
AND B.[CrossReference_No_] LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI
AND (B.[Cross-Reference Type] = 3)
WHERE (A.No_ LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI
OR A.Description LIKE '%020212601%' COLLATE Modern_Spanish_100_CI_AI
)
;
GO
itemno | description | m3item | Item_No_ | CrossReference_Type | CrossReference_No_ | Cross-Reference Type
:-------- | :---------- | :----- | :-------- | ------------------: | :----------------- | -------------------:
020212601 | BLA BLA | null | 020212601 | 2 | 020212601 | 3
020212601 | BLA BLA | null | 020212601 | 2 | 020212601 | 3
SELECT
A.No_ AS itemno
, A.Description AS description
, A.[Producto M3] AS m3item
, b.*
FROM [dbo].[PRUEBAS$Item] A
LEFT OUTER JOIN [dbo].[PRUEBAS$Item Cross Reference] B ON A.No_ = B.[Item_No_]
AND (B.[Cross-Reference Type] = 3)
WHERE (A.No_ LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI
OR A.Description LIKE '%020212601%' COLLATE Modern_Spanish_100_CI_AI
OR B.[CrossReference_No_] LIKE '020212601%' COLLATE Modern_Spanish_100_CI_AI
)
;
itemno | description | m3item | Item_No_ | CrossReference_Type | CrossReference_No_ | Cross-Reference Type
:-------- | :---------- | :----- | :-------- | ------------------: | :----------------- | -------------------:
020212601 | BLA BLA | null | 020212601 | 2 | null | 3
020212601 | BLA BLA | null | 020212601 | 2 | 020212601 | 3
020212601 | BLA BLA | null | 020212601 | 2 | null | 3
020212601 | BLA BLA | null | 020212601 | 2 | 020212601 | 3