SQL 服务器 - 动态列的 WHERE 子句
SQL Server - WHERE Clauses for column dynamic
我有以下 table,
id idAttribute valueAttribute idPiece
1 9 '2048' 10
2 18 'DDR3' 10
3 9 '2048' 11
4 18 'DDR3' 12
执行此查询时:
SELECT *
FROM tb_inventary_report
WHERE (idAtribute = 9 AND valueAtribute = '2048')
OR (idAtribute = 18 AND valueAtribute = 'DDR3')
我正在 return 记录 1、2、3 和 4,但是我只想 return 1 和 2,因为它们具有相同的 idPiece,但我无法通知 idPiece,即,idPiece 在我传递的 OR 之间必须相等
我怎样才能 return 只有 1 和 2?
使用 exists()
聚合查询 count(*)
符合您条件的行,having count(*) =
您需要匹配的条件数。
select *
from tb_inventary_report as t
where exists (
select 1
from tb_inventary_report as i
where i.idPiece = t.idPiece
and (
(idAttribute = 9 and valueAttribute = '2048')
or (idAttribute = 18 and valueAttribute = 'ddr3')
)
group by i.idPiece
having count(*) = 2
)
rextester 演示:http://rextester.com/TKXCJ68213
returns:
+----+-------------+----------------+---------+
| id | idattribute | valueattribute | idpiece |
+----+-------------+----------------+---------+
| 1 | 9 | 2048 | 10 |
| 2 | 18 | ddr3 | 10 |
+----+-------------+----------------+---------+
如果我没有正确理解你的问题,你会希望在你的 WHERE
子句中包含两部分; idPiece 的值,以及您当前在 WHERE
子句中的任一选项。话虽如此,您可以执行以下操作:
SELECT
*
FROM tb_inventary_report
WHERE idPiece = <insert value here.
AND( (idAtribute = 9 AND valueAtribute = '2048')
OR (idAtribute = 18 AND valueAtribute = 'DDR3'))
说明:如果您将当前版本括在一组括号中,它将评估其中的所有内容作为一个条件。许多人偶然发现的是省略了这个括号,这会给你带来截然不同的结果;即,它将评估前两个条件 (AND) 的组合,如果第三个条件单独为真,则 OR
。
如果您想要 select 所有 idPiece
具有 idAttribute、valueAttribute 对的值
然后您可以按 idPiece 分组并计算不同 idAttributes 的数量:
SELECT idPiece
FROM tb_inventary_report
WHERE (idAtribute = 9 AND valueAtribute = '2048')
OR (idAtribute = 18 AND valueAtribute = 'DDR3')
GROUP BY idPiece
HAVING COUNT(distinct idAttribute) > 1
如果你想select整行,那么你可以把上面的查询放在派生的table
SELECT * FROM tb_inventary_report t1
JOIN (
SELECT idPiece
FROM tb_inventary_report
WHERE (idAtribute = 9 AND valueAtribute = '2048')
OR (idAtribute = 18 AND valueAtribute = 'DDR3')
GROUP BY idPiece
HAVING COUNT(distinct idAttribute) > 1
) t2 on t2.idPiece = t1.idPiece
WHERE (t1.idAtribute = 9 AND t1.valueAtribute = '2048')
OR (t1.idAtribute = 18 AND t1.valueAtribute = 'DDR3')
我有以下 table,
id idAttribute valueAttribute idPiece
1 9 '2048' 10
2 18 'DDR3' 10
3 9 '2048' 11
4 18 'DDR3' 12
执行此查询时:
SELECT *
FROM tb_inventary_report
WHERE (idAtribute = 9 AND valueAtribute = '2048')
OR (idAtribute = 18 AND valueAtribute = 'DDR3')
我正在 return 记录 1、2、3 和 4,但是我只想 return 1 和 2,因为它们具有相同的 idPiece,但我无法通知 idPiece,即,idPiece 在我传递的 OR 之间必须相等
我怎样才能 return 只有 1 和 2?
使用 exists()
聚合查询 count(*)
符合您条件的行,having count(*) =
您需要匹配的条件数。
select *
from tb_inventary_report as t
where exists (
select 1
from tb_inventary_report as i
where i.idPiece = t.idPiece
and (
(idAttribute = 9 and valueAttribute = '2048')
or (idAttribute = 18 and valueAttribute = 'ddr3')
)
group by i.idPiece
having count(*) = 2
)
rextester 演示:http://rextester.com/TKXCJ68213
returns:
+----+-------------+----------------+---------+
| id | idattribute | valueattribute | idpiece |
+----+-------------+----------------+---------+
| 1 | 9 | 2048 | 10 |
| 2 | 18 | ddr3 | 10 |
+----+-------------+----------------+---------+
如果我没有正确理解你的问题,你会希望在你的 WHERE
子句中包含两部分; idPiece 的值,以及您当前在 WHERE
子句中的任一选项。话虽如此,您可以执行以下操作:
SELECT
*
FROM tb_inventary_report
WHERE idPiece = <insert value here.
AND( (idAtribute = 9 AND valueAtribute = '2048')
OR (idAtribute = 18 AND valueAtribute = 'DDR3'))
说明:如果您将当前版本括在一组括号中,它将评估其中的所有内容作为一个条件。许多人偶然发现的是省略了这个括号,这会给你带来截然不同的结果;即,它将评估前两个条件 (AND) 的组合,如果第三个条件单独为真,则 OR
。
如果您想要 select 所有 idPiece
具有 idAttribute、valueAttribute 对的值
然后您可以按 idPiece 分组并计算不同 idAttributes 的数量:
SELECT idPiece
FROM tb_inventary_report
WHERE (idAtribute = 9 AND valueAtribute = '2048')
OR (idAtribute = 18 AND valueAtribute = 'DDR3')
GROUP BY idPiece
HAVING COUNT(distinct idAttribute) > 1
如果你想select整行,那么你可以把上面的查询放在派生的table
SELECT * FROM tb_inventary_report t1
JOIN (
SELECT idPiece
FROM tb_inventary_report
WHERE (idAtribute = 9 AND valueAtribute = '2048')
OR (idAtribute = 18 AND valueAtribute = 'DDR3')
GROUP BY idPiece
HAVING COUNT(distinct idAttribute) > 1
) t2 on t2.idPiece = t1.idPiece
WHERE (t1.idAtribute = 9 AND t1.valueAtribute = '2048')
OR (t1.idAtribute = 18 AND t1.valueAtribute = 'DDR3')