我有以下SQL查询,它以某种方式被破坏了:
SELECT *
FROM (
SELECT ID, TEST, CHR, NUMBER
FROM Test_Table
JOIN ...
WHERE ...
) TEMP_TABLE
FROM TEMP_TABLE a
LEFT
JOIN TEMP_TABLE b
ON b.test = a.test
AND b.chr = 'x'
WHERE a.number IN (5,6)
AND b.id IS NULL
GROUP
BY a.test
HAVING COUNT(*) = 2;
从第一个FROM
语句中我得到以下临时表:
ID , TEST, CHR , NUMBER
------------------------------
( 1 , 7 , 'C' , 5),
( 2 , 7 , 'T' , 6),
( 3 , 8 , 'C' , 4),
( 4 , 8 , 'T' , 5),
( 5 , 9 , 'A' , 4),
( 6 , 9 , 'G' , 5),
( 7 , 10 , 'T' , 4),
( 8 , 10 , 'A' , 5),
( 9 , 10 , 'X' , 6),
(10 , 14 , 'T' , 4),
(11 , 14 , 'G' , 5);
从FROM TEMP_TABLE ...
我尝试实施以下条件:
例如test
第7列包含两行,如果number
列包含值5和6,并且{{1}中的值 X 1}}列,我想选择在chr
列中选择包含7的行。
例如test
第10列包含三行,如果test
列包含值5和6,并且值{strong> X 存在于{{1 }}列,我想在number
列中排除10行。
因此,它应该只有chr
列7,因为test
列7在test
列中有5和6而不是X.
结果示例:
test
上述SQL查询出了什么问题?
答案 0 :(得分:3)
您的查询有两个FROM
子句删除一个并尝试如下
SELECT *
FROM (
SELECT ID, TEST, CHR, NUMBER
FROM Test_Table
JOIN ...
WHERE ...
) a
LEFT JOIN
(
SELECT ID, TEST, CHR, NUMBER
FROM Test_Table
JOIN ...
WHERE ...
) b
ON b.test = a.test
AND b.chr = 'x'
WHERE a.number IN (5,6)
AND b.id IS NULL
GROUP
BY a.test
HAVING COUNT(*) = 2;
更简单的方法是使用TEMPORARY
关键字创建TEMPORARY
表格,如提及here
CREATE TEMPORARY TABLE TEMP_TABLE (ID int, TEST varchar(100), CHR char, NUMBER int );
INSERT INTO TEMP_TABLE
(SELECT ID, TEST, CHR, NUMBER
FROM Test_Table
JOIN ...
WHERE ...);
SELECT *
FROM TEMP_TABLE a
LEFT
JOIN TEMP_TABLE b
ON b.test = a.test
AND b.chr = 'x'
WHERE a.number IN (5,6)
AND b.id IS NULL
GROUP
BY a.test
HAVING COUNT(*) = 2;