曾见过类似的问题,但并不完全相同。我有一个带有多个ID的表,并想做一个适合所有PID的select语句,并返回一次。
const Login = (props) => {
const [inputs, setInputs] = useState({
userid: "",
password: "",
rememberPassword: false,
});
const [submitted, setSubmitted] = useState(false);
const { userid, password, rememberPassword } = inputs;
// reset login status
useEffect(() => {
dispatch(loginActions.logout());
}, []);
function handleChange(e) {
const { name, value } = e.target;
setInputs((inputs) => ({ ...inputs, [name]: value }));
}
function handleChechbox(e) {
const { name, value } = e.target;
console.log("eeeeee check", e.target.type);
console.log("eeeeee check", e.target.checked);
console.log("eeeeee check inputs", inputs);
console.log("eeeeee check inputs remember", inputs.rememberPassword);
if (e.target.type === "checkbox" && !e.target.checked) {
setInputs((inputs) => ({ ...inputs, [name]: "" }));
} else {
setInputs((inputs) => ({ ...inputs, [name]: value }));
}
}
function handleSubmit(e) {
e.preventDefault();
setSubmitted(true);
if (inputs) {
// get return url from location state or default to home page
const { from } = location.state || {
from: { pathname: "/admin/summary" },
};
dispatch(loginActions.login(inputs, from));
// props.history.push("/admin/summary");
}
}
return (
<div className="Login">
<div className="login-form-container">
<div className="content">
<Form className="login-form" onSubmit={handleSubmit}>
<InputGroup>
<InputGroupAddon
className="input-group-addon"
addonType="prepend"
>
<i className="fa fa-user"></i>
</InputGroupAddon>
<input
autoFocus
type="email"
aria-label="Username"
aria-describedby="Username"
aria-invalid="false"
placeholder="Username or Email"
name="userid"
value={userid}
onChange={(event) => handleChange(event)}
className={
"form-control" + (submitted && !userid ? " is-invalid" : "")
}
/>
{submitted && !userid && (
<div className="invalid-feedback">
Username or Email is required
</div>
)}
</InputGroup>
<InputGroup>
<InputGroupAddon
className="input-group-addon"
addonType="prepend"
>
<i className="fa fa-lock"></i>
</InputGroupAddon>
<input
type="password"
name="password"
placeholder="Password"
aria-label="password"
aria-describedby="password"
value={password}
onChange={(event) => handleChange(event)}
className={
"form-control" + (submitted && !password ? " is-invalid" : "")
}
/>
{submitted && !password && (
<div className="invalid-feedback">Password is required</div>
)}
</InputGroup>
<div className="form-actions">
<br />
<div className="form-check">
<input
type="checkbox"
className="form-check-input"
id="rememberPassword"
name="checkbox"
checked={rememberPassword}
onChange={(event) => handleChechbox(event)}
// required
/>
<label className="form-check-label" for="rememberPassword">
Remember me
</label>
</div>
</div>
</Form>
</div>
</div>
</div>
);
};
换句话说,如果123 = TR且234 = US且536 = L(希望如此)返回1,而不是1,1,1。
我做不到
+----+-----+-----+-------+
| ID | PID | DET | DETOP |
+----+-----+-----+-------+
| 1 | 123 | TR | EQ |
| 1 | 234 | US | EQ |
| 1 | 536 | L | EQ |
| 2 | 123 | TR | EQ |
| 2 | 234 | US | EQ |
| 2 | 536 | D | EQ |
+----+-----+-----+-------+
那样只会返回零结果。最好的方法是什么?
答案 0 :(得分:3)
我认为您想要HAVING
?
SELECT ID
FROM dbo.YourTable
GROUP BY ID
HAVING COUNT(CASE WHEN PID = 123 AND DET = 'TR' THEN 1 END) > 0
AND COUNT(CASE WHEN PID = 243 AND DET = 'US' THEN 1 END) > 0
AND COUNT(CASE WHEN PID = 536 AND DET = 'L' THEN 1 END) > 0;
答案 1 :(得分:2)
您可以使用聚合和Runnable
。假设没有重复的having
,您可以这样写:
(id, pid, det)
答案 2 :(得分:2)
这是关系划分的经典案例。解决方法是:
CREATE TABLE MYTABLE (ID INT,
PID INT ,
DET CHAR(3),
DETOP CHAR(2),
PRIMARY KEY (ID, PID));
GO
INSERT INTO MYTABLE VALUES
(1, 123, 'TR', 'EQ'),
(1, 234, 'US', 'EQ'),
(1, 536, 'L ', 'EQ'),
(2, 123, 'TR', 'EQ'),
(2, 234, 'US', 'EQ'),
(2, 536, 'D ', 'EQ');
用于数据测试。
查询以解决此问题:
WITH
DATASET AS
(SELECT *
FROM (VALUES (123, 'TR'),
(234, 'US'),
(536, 'L'))
T(PID, DET))
SELECT M.ID
FROM DATASET AS D
JOIN MYTABLE AS M
ON D.PID = M.PID AND D.DET = M.DET
GROUP BY M.ID
HAVING COUNT(*) = (SELECT COUNT(DISTINCT PID)
FROM DATASET)