用于选择行的 Where 语句层次结构
Where statement Hierarchy for Selecting rows
我有一个 table,其中有一列名为 ReportTypeId。我想要 select 行,其中 ReportTypeId = 1,但如果没有行,那么我想要 ReportTypeId = 2。我正在尝试使用 WHEN EXISTS,但我不知道如何 select不止一列。我想写一个看起来像这样的查询:
SELECT CASE
WHEN EXISTS (SELECT PerformanceReport FROM ReportData
WHERE (ReportId = 79 and ReportTypeId = 1))
THEN (select * from ReferenceData
where ReportTypeId = 1)
ELSE (select * from ReferenceData
where ReportTypeId = 2)
END
但是因为我试图 return 不止一列,所以它不起作用。有没有一种方法可以创建基于数据是否存在的 WHERE 语句的查询?
您可以使用以下解决方案:
SELECT *
FROM ReferenceData
WHERE (
ReportTypeId = 1
AND EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 1 AND ReportId = 79)
) OR (
ReportTypeId = 2
AND NOT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 1 AND ReportId = 79)
)
您可以使用 JOIN
优化它:
SELECT ReferenceData.*
FROM ReferenceData JOIN (
SELECT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 1 AND ReportId = 79) AS state
) isAvailable
WHERE (
ReportTypeId = 1 AND isAvailable.state = 1
) OR (
ReportTypeId = 2 AND isAvailable.state = 0
)
您可以使用 JOIN
添加多项检查:
SELECT ReferenceData.*
FROM ReferenceData JOIN (
SELECT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 1 AND ReportId = 79) AS state
) avail1 JOIN (
SELECT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 2 AND ReportId = 79) AS state
) avail2 JOIN (
SELECT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 3 AND ReportId = 79) AS state
) avail3
WHERE (
ReportTypeId = 1 AND avail1.state = 1
) OR (
ReportTypeId = 2 AND avail1.state = 0 AND avail2.state = 1
) OR (
ReportTypeId = 3 AND avail1.state = 0 AND avail2.state = 0 AND avail3.state = 1
) OR (
ReportTypeId = 4 AND avail1.state = 0 AND avail2.state = 0 AND avail3.state = 0
)
如果RecordTypeId
可以订**,那么可以用下面的
SELECT PerformanceReport
FROM ReferenceData
WHERE ReportTypeId = (
SELECT MIN(ReportTypeId)
FROM ReportData
WHERE ReportTypeId IN (1, 2)
AND ReportId = 79
)
** 按顺序,我的意思是 MIN
聚合函数将 return 预期结果。对于整数,这是有道理的,但是,如果您的报告类型 ID 是文本 uuid,那么 MIN
仍然有效,但不会给您预期的结果,因为它将 return 词法顺序中的最小 ID .
您似乎想要:
SELECT refd.*
FROM ReferenceData refd
WHERE (refd.ReportType = 1 AND
EXISTS (SELECT 1
FROM ReportData repd
WHERE repd.ReportId IN (1, 79)
)
) OR
(refd.ReportType = 2 AND
EXISTS (SELECT 1
FROM ReportData repd
WHERE repd.ReportId NOT IN (1, 79)
)
)
我有一个 table,其中有一列名为 ReportTypeId。我想要 select 行,其中 ReportTypeId = 1,但如果没有行,那么我想要 ReportTypeId = 2。我正在尝试使用 WHEN EXISTS,但我不知道如何 select不止一列。我想写一个看起来像这样的查询:
SELECT CASE
WHEN EXISTS (SELECT PerformanceReport FROM ReportData
WHERE (ReportId = 79 and ReportTypeId = 1))
THEN (select * from ReferenceData
where ReportTypeId = 1)
ELSE (select * from ReferenceData
where ReportTypeId = 2)
END
但是因为我试图 return 不止一列,所以它不起作用。有没有一种方法可以创建基于数据是否存在的 WHERE 语句的查询?
您可以使用以下解决方案:
SELECT *
FROM ReferenceData
WHERE (
ReportTypeId = 1
AND EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 1 AND ReportId = 79)
) OR (
ReportTypeId = 2
AND NOT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 1 AND ReportId = 79)
)
您可以使用 JOIN
优化它:
SELECT ReferenceData.*
FROM ReferenceData JOIN (
SELECT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 1 AND ReportId = 79) AS state
) isAvailable
WHERE (
ReportTypeId = 1 AND isAvailable.state = 1
) OR (
ReportTypeId = 2 AND isAvailable.state = 0
)
您可以使用 JOIN
添加多项检查:
SELECT ReferenceData.*
FROM ReferenceData JOIN (
SELECT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 1 AND ReportId = 79) AS state
) avail1 JOIN (
SELECT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 2 AND ReportId = 79) AS state
) avail2 JOIN (
SELECT EXISTS (SELECT * FROM ReportData WHERE ReportTypeId = 3 AND ReportId = 79) AS state
) avail3
WHERE (
ReportTypeId = 1 AND avail1.state = 1
) OR (
ReportTypeId = 2 AND avail1.state = 0 AND avail2.state = 1
) OR (
ReportTypeId = 3 AND avail1.state = 0 AND avail2.state = 0 AND avail3.state = 1
) OR (
ReportTypeId = 4 AND avail1.state = 0 AND avail2.state = 0 AND avail3.state = 0
)
如果RecordTypeId
可以订**,那么可以用下面的
SELECT PerformanceReport
FROM ReferenceData
WHERE ReportTypeId = (
SELECT MIN(ReportTypeId)
FROM ReportData
WHERE ReportTypeId IN (1, 2)
AND ReportId = 79
)
** 按顺序,我的意思是 MIN
聚合函数将 return 预期结果。对于整数,这是有道理的,但是,如果您的报告类型 ID 是文本 uuid,那么 MIN
仍然有效,但不会给您预期的结果,因为它将 return 词法顺序中的最小 ID .
您似乎想要:
SELECT refd.*
FROM ReferenceData refd
WHERE (refd.ReportType = 1 AND
EXISTS (SELECT 1
FROM ReportData repd
WHERE repd.ReportId IN (1, 79)
)
) OR
(refd.ReportType = 2 AND
EXISTS (SELECT 1
FROM ReportData repd
WHERE repd.ReportId NOT IN (1, 79)
)
)