选择QUERY SORT问题

时间:2011-09-16 04:27:21

标签: sql select

我有2个表,一个主表和一个事务表。我想排序 根据条件查询主表的结果:如果学生编号和studname已经存在 存在于事务表中或基本上,如果记录(stud no,studname)已经在 交易表)。

如果记录已存在,则结果集应位于查询的最后部分。

我以前在这里查询。我将合并2个数据集或使用UNION

我在这里有一个查询,但似乎不起作用:

SELECT m.studno, m.studname FROM MASTERTABLE M 
inner JOIN TRANSACTTABLE S
ON m.STUDNO <> s.STUDNOO  and  m.studname <> s.studname

- 此查询适用于非现有记录,它应位于查询集之上。

SELECT m.studno, m.studname FROM MASTERTABLE M 
inner JOIN TRANSACTTABLE S
ON m.STUDNO = s.STUDNOO  and  m.studname = s.studname

- 此查询适用于现有记录,它应位于查询集的lastrow中。

只是一个例子:

让我们说MASTERTABLE CONTAINS

id, studno,    studname
9    78797     aaa
10  878         bbb
11  675         ccc
12  099         ddd

TRANSACTTABLE

id,     studno,    studname
13    878 bbb
14     675 ccc

查询结果应为:

   studno, studname
    78797 aaa
    099 ddd
    878 bbb
    675 ccc

前两行应该由studname aaa和ddd组成,因为两者没有 交易表中存在,最后两个是bbb&amp; ccc因为它确实如此 存在于tranasct表中。

我怎样才能做到这一点?

感谢。请帮忙

2 个答案:

答案 0 :(得分:3)

试试这个:

SELECT m.studno, m.studname
FROM MASTERTABLE M
LEFT JOIN TRANSACTTABLE S ON m.STUDNO = s.STUDNOO  and  m.studname = s.studname 
ORDER BY s.STUDNO

s.STUDNO中的NULL值将收集所有没有匹配的行。

答案 1 :(得分:0)

试试这个 - 它基本上使用了Phil的答案所具有的LEFT OUTER JOIN,并且根据TransactTable是否有值,它定义了Sequence值并对其进行排序:

DECLARE @MasterTable TABLE (ID INT, StudNo INT, StudName VARCHAR(20))

INSERT INTO @MasterTable 
  VALUES(9, 78797, 'aaa'), (10, 878, 'bbb'), (11, 675, 'ccc'), (12, 099, 'ddd')

DECLARE @Transact TABLE (ID INT, StudNo INT, StudName VARCHAR(20))

INSERT INTO @Transact 
  VALUES(13, 878, 'bb'), (14, 675, 'ccc')

SELECT 
    m.studno, m.studname,
    CASE WHEN s.studname IS NULL THEN 1 ELSE 0 END 'Sequence'
FROM 
    @MASTERTABLE M
LEFT OUTER JOIN 
    @TRANSACT S ON m.STUDNO = s.STUDNO  
ORDER BY 
    sequence DESC, s.STUDNO DESC

我得到的输出是:

studno  studname  Sequence
78797   aaa         1
   99   ddd         1
  878   bbb         0
  675   ccc         0