2014-10-18 50 views
0
创建

我有以下SQL查询它以某种方式打破:选择数据的SELECT

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 ...我尝试实施下列条件:

  1. 例如test第7列包含两行,如果number列包含值5和6,并且该值不是在chr列中,我想选择在test列中选择具有7的行。

  2. 例如test柱10含有三行,如果number列包含值5和6,以及值X存在于chr列中,我想在test柱10以排除行。

至于导致只应test柱7,因为test第7列有5个和6个在number列,而不是X.

结果例如:

ID | TEST | CHR | NUMBER    
1 | 7 | C | 5   
2 | 7 | T | 6 

做什么上面的SQL查询出错了吗?

回答

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;