对于像这样的 OrderLine 表:
| 命令 | 线 | 第 3 列 | 第 4 列 |
|---|---|---|---|
| 1 | 1 | X | X |
| 1 | 2 | X | 是 |
| 2 | 1 | 是 | X |
| 2 | 2 | 是 | X |
| 3 | 1 | X | 是 |
| 3 | 2 | 是 | 是 |
| 4 | 1 | X | 是 |
| 4 | 2 | X | 是 |
Col4 可以是 X 或 Y,但不能同时是两者。该表中的命令 1 违反了规则。如何查找同一订单在 Col4 中具有不同值的所有订单?
我最初的想法是多次加入表,然后使用 HAVING 子句。
SELECT DISTINCT A.[Order], A.Line, A.Col3, A.Col4, A.Col4
FROM OrderLines A
INNER JOIN OrderLines B ON B.[Order]= A.[Order]
AND B.Line = A.Line
GROUP BY A.[Order], A.Line, A.Col3, A.Col4, A.Col4, B.[Order], B.Line, B.Col4
HAVING(A.Line <> B.Line AND A.Col4 <> B.Col4)
ORDER BY A.[Order] ASC, A.Line ASC
Run Code Online (Sandbox Code Playgroud)
查找同一订单在 Col4 中具有不同值的所有订单
--Create OrderLine table
CREATE TABLE OrderLine
(
[Order] VARCHAR(512),
Line VARCHAR(512),
col3 VARCHAR(512),
col4 VARCHAR(512)
);
--Populate OrderLine table
INSERT INTO OrderLine ([Order] , Line , col3 , col4) VALUES
('1 ', '1 ', 'X ', 'X'),
('1 ', '2 ', 'X ', 'Y'),
('2 ', '1 ', 'Y ', 'X'),
('2 ', '2 ', 'Y ', 'X'),
('3 ', '1 ', 'X ', 'Y'),
('3 ', '2 ', 'Y ', 'Y'),
('4 ', '1 ', 'X ', 'Y'),
('4 ', '2 ', 'X ', 'Y')
--Verify that the record were added correctly
SELECT * FROM OrderLine
--Select all order rows that have differing col4 values
SELECT * FROM OrderLine
WHERE [order] in
(
SELECT [order]
FROM OrderLine group by [order]
HAVING min(col4)<>max(col4)
)
Run Code Online (Sandbox Code Playgroud)
| 命令 | 线 | 第 3 列 | 第 4 列 |
|---|---|---|---|
| 1 | 1 | X | X |
| 1 | 2 | X | 是 |