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')