我有一个名为文档的表,其中包含字段 Document_ID (主键)和 Cluster_ID ,现在我想要所有的Document_ID相同的Cluster_ID,基于Document_ID(作为参数传递),Cluster_ID的默认值为' -1'。
例如: dbo.Documents
Document ID ******** Cluster_ID
- 1****************** -1
- 2****************** 1001
- 3****************** 1001
- 4****************** -1
- 5****************** 1002
- 6****************** 1001
- 7****************** -1
- 8****************** -1
- 9****************** -1
现在, 如果Document_ID是2,那么我想将结果作为Document_ID = 2,3,6的行,这里我无法处理具有cluster_ID = -1的记录;(因为-1 id是表的默认值,并且有数百个匹配的记录在表中)
我尝试了下面提到的查询工作正常,但是当我执行Document_ID = 7的查询时,它将返回5行,其中cluster_ID = -1,
SELECT d2.*
FROM dbo.Documents d1
join dbo.Documents d2 on d1.Cluster_ID=d2.Cluster_ID
WHERE d1.Document_ID =2
我的问题是: 它返回表中具有Cluster_ID = -1的所有行,我想要的是,如果Cluster_ID = -1,则返回单行else返回具有相同cluster_ID的所有行
答案 0 :(得分:1)
尝试此查询
SELECT
Document_ID,
Cluster_ID
FROM Documents
WHERE Cluster_ID =
(
SELECT
Cluster_ID
FROM Documents
WHERE Document_ID = @Document_ID
)
AND Cluster_ID <> -1
UNION
SELECT
Document_ID,
Cluster_ID
FROM Documents
WHERE Document_ID = @Document_ID
AND Cluster_ID = -1
答案 1 :(得分:0)
请试试这个。 这里 @doumentId 是您需要传递的参数。
DECLARE @Cluster_ID int
SET Cluster_ID = (
SELECT Cluster_ID
FROM
FROM Documents
WHERE Document_ID = @documentId
)
IF Cluster_ID > 0
BEGIN
SELECT *
FROM Documents
WHERE Cluster_ID = (
SELECT Cluster_ID
FROM Documents
WHERE Document_ID = @documentId
)
END
ELSE
BEGIN
SELECT *
FROM
FROM Documents
WHERE Document_ID = @documentId
END
答案 2 :(得分:0)
您需要两个与UNION ALL结合的查询。如果Cluster_ID不等于-1,则第一个为您提供所有需要的记录。第二个为您提供了Cluster_ID等于-1的情况的一条记录。所以你得到第一部分的记录或第二部分的记录。
select Document_ID, Cluster_ID
from dbo.Documents
where Cluster_ID in
(
select nullif(Cluster_ID, -1)
from dbo.Documents
where Document_ID = @Document_ID
)
UNION ALL
select Document_ID, Cluster_ID
from dbo.Documents
where Document_ID = @Document_ID and Cluster_ID = -1
答案 3 :(得分:0)
您可以尝试此IF \ Else查询
DECLARE @Cluster_ID int;
SELECT @Cluster_ID=Cluster_ID FROM Documents WHERE Document_ID=@Document_ID;
IF @Cluster_ID=-1
BEGIN
SELECT Document_ID,Cluster_ID FROM Documents WHERE Document_ID=@Document_ID;
END
ELSE
BEGIN
SELECT Document_ID,Cluster_ID FROM Documents WHERE Cluster_ID=@Cluster_ID;
END
此查询将采用clusterid,然后根据它是否为-1返回单行或所有行