아이디 | 이름 |
1 | aa |
2 | bb |
3 | cc |
1 | aa |
2 | bb |
3 | cc |
ID | 이름 |
1 | aa |
2 | bb |
3 | cc |
SELECT DISTINCT ID,, 이름 INTO #t FROM table1 DELETE table1 끼워 넣다 INTO 테이블1 선택하다 * #t부터 |
ID | 직원 | 기술 |
1 | 1 | VB |
2 | 1 | PHP |
3 | 1 | ASP |
4 | 2 | PHP |
5 | 3 | ASP |
6 | 4 | VB |
7 | 4 | ASP |
SELECT 직원 FROM [테이블] WHERE 직원 IN(SELECT 직원 FROM [테이블] WHERE Skill='VB' ) AND Skill='PHP' |
3. 데이터베이스 병합 문제
액세스에 두 개의 테이블이 있습니다. 두 테이블의 내용을 병합하고 싶습니다.
테이블 [a]의 구조는 다음과 같습니다.
[id] | 번호 | 자동 번호 |
[이름] | 이름 | 텍스트 |
[가격] | 가격 | 번호 |
[guige] | 사양 | 텍스트 |
[changjia] | 제조업체 | 텍스트 |
[baozhuang] | 포장 | 텍스트 |
[danwei] | 단위 | 텍스트 |
총 900개의 레코드가 있습니다. ID 및 이름 필드를 제외하고 나머지는 모두 비어 있을 수 있습니다.
표 [b]는 다음과 같은 구조를 가지고 있습니다.
[id] | 번호 | 자동 번호 |
[이름] | 이름 | 텍스트 |
[가격] | 가격 | 번호 |
[changjia] | 제조업체 | 텍스트 |
[danwei] | 단위 | 텍스트 |
[xingzhi] | 속성 | 텍스트 |
총 800개의 레코드가 있습니다. id 및 name 필드를 제외하고 테이블 [a]보다 적은 필드가 있지만 다른 모든 필드는 비어 있을 수 있습니다.
이제 다음 구조를 갖는 새 테이블 [c]를 생성하려고 하며, 내용은 두 테이블 내용의 합입니다.
[id] | 번호 | 자동 번호 |
[이름] | 이름 | 텍스트 |
[가격] | 가격 | 번호 |
[guige] | 사양 | 텍스트 |
[changjia] | 제조업체 | 텍스트 |
[baozhuang] | 포장 | 텍스트 |
[danwei] | 단위 | 텍스트 |
[xingzhi] | 자연 | 텍스트 |
SQL 문, 수동 작업 또는 XML을 사용할 수 있습니다. 구현 방법에 대해 걱정하지 마십시오. 정말 800개의 레코드를 입력해야 하면 죽을 것입니다.
답변:
1. 이쪽으로
c(id,name,.....)에 삽입 ID, 이름을 선택하세요.... 에서 c(id,name,.....)에 삽입 최대(id)+1, 이름,.....을 선택합니다. b에서 |
2.수정:
쿼리 분석기에서 직접 실행하는 경우:
c(이름,...)에 삽입 이름을 선택하세요,..... 에서 c(이름,...)에 삽입 이름을 선택하세요,..... b에서 |
3. Union 방식을 사용하라
[c]에 삽입 ([id], 번호, 자동번호) [a]에서 [id], 번호, 자동번호 선택 노동 조합 [b]에서 [id], 번호, 자동번호 선택 |
4.asp 솔루션
<% '테이블 a의 루프 감지 rs = Server.CreateObject("ADODB.RECORDSET")를 설정합니다. rs.open "ID별 주문에서 * 선택",conn,1,1 rs.eof가 아닌 동안 수행 Call actAdd(rs("name")) '테이블 b에 콘텐츠를 추가하는 것과 같은 함수를 호출하세요! rs.이동다음 고리 RS.닫기 설정자=아무것도 없음 하위 행위추가(txt) 희미한 TS, SQL sql = "b(이름) 값에 삽입('"& txt &"')" ts = Conn.Execute(sql) 설정 ts.닫기 ts = 없음으로 설정 끝 서브 %> |
5.asp 솔루션
<% 희미한 arr_temp1,arr_temp2,arr_data set rs=conn.execute("a에서 id,name,price,guige,changjia,baozhuang,danwei 선택") arr_temp1=rs.getrows RS.닫기 rs=아무것도 설정하지 않음 set rs=conn.execute("b에서 id,name,price,guige,changjia,danwei,xingzhi 선택") arr_temp2=rs.getrows RS.닫기 rs=아무것도 설정하지 않음 rem이 처리를 시작합니다 redim arr_data(ubound(arr_temp1,2)+ubound(arr_temp2,2),7) rem은 두 배열의 내용을 복사합니다. 이 부분은 제가 직접 작성하고 두 개의 루프를 만든 다음 데이터베이스에 저장했습니다. %> |
마지막으로 일부 고전적인 SQL 문을 변환합니다.
1. Wawa 추천: 절묘한 SQL 문
설명: 테이블 복사(구조만 복사, 원본 테이블 이름: a, 새 테이블 이름: b)
SQL: 1<>1인 a에서 *를 b로 선택
설명: 복사 테이블(복사 데이터, 원본 테이블 이름: a, 대상 테이블 이름: b)
SQL: b(a, b, c)에 삽입하고 b에서 d,e,f를 선택합니다.
설명: 기사, 제출자 및 마지막 응답 시간을 표시합니다.
SQL: 테이블 a에서 a.title,a.username,b.adddate를 선택합니다.(table.title=a.title인 테이블에서 max(adddate) adddate를 선택합니다.) b
설명: Outer Join 쿼리 (테이블명 1: 테이블명 2: b)
SQL: LEFT OUT JOIN b ON aa = bc에서 aa, ab, ac, bc, bd, bf를 선택합니다.
설명: 5분 전에 미리 알림을 예약하세요.
SQL: datediff('분',f 시작 시간,getdate())>5인 일정에서 *를 선택합니다.
설명: 두 개의 관련 테이블, 보조 테이블에 없는 기본 테이블의 정보를 삭제합니다.
SQL:
존재하지 않는 정보에서 삭제( info.infid=infobz.infid인 infobz에서 * 선택)
설명:--
SQL:
A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE를 선택하세요.
표1에서,
(X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE 선택
FROM(SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND)
표 2에서
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
(NUM, UPD_DATE, STOCK_ONHAND 선택)
표 2에서
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,
여기서 X.NUM = Y.NUM (+)
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B
여기서 A.NUM = B.NUM
설명:--
SQL:
존재하지 않는 Studentinfo에서 * 선택(studentinfo.id=student.id인 학생에서 * 선택) 및 학과 이름='"&strdepartmentname&"' 및 전공 이름='"&strprofessionname&"' 성별, 학생 출신지, 전체 대학순 입학 시험 점수
설명하다:
데이터베이스에서 1년 동안의 각 단위의 전화 요금 통계를 가져옵니다(전화 요금 할당량, 축하, 전보 및 비료 목록, 두 개의 테이블 소스)
SQL:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS 텔이어,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
TELFEESTAND a, TELFEEE b에서
여기서 a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')
설명: 4개 테이블 공동 쿼리 문제:
SQL: aa=bb의 왼쪽 내부 조인 b에서 *를 선택합니다. aa=cc의 오른쪽 내부 조인 c aa=dd의 내부 조인 d 여기서 .....
설명: 테이블에서 사용되지 않은 가장 작은 ID 번호를 가져옵니다.
SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM 핸들 b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
핸들로부터
HandleID IN이 아닌 곳(선택 a.HandleID - 핸들 a에서 1)
2. 중복 데이터 제거
1. 기본키를 가지고 있는 경우
a. 고유 필드 ID(고유 기본 키)
테이블 삭제
아이디가 없는 곳
(
col1,col2,col3...별로 테이블 그룹에서 max(id)를 선택합니다.
)
group by 절 뒤의 필드는 중복 여부를 판단하는 데 사용하는 조건입니다. 예를 들어 col1만 있는 경우 col1 필드의 내용이 동일하면 레코드가 동일하다는 의미입니다.
b.공동 기본 키를 가집니다.
col1+','+col2+','...col5가 공동 기본 키라고 가정합니다.
col1+','+col2+','...col5가 있는 테이블에서 *를 선택합니다(
테이블에서 max(col1+','+col2+','...col5)를 선택하세요.
여기서 count(*)>1
col1,col2,col3,col4별로 그룹화
)
group by 절 뒤의 필드는 중복 여부를 판단하는 데 사용하는 조건입니다. 예를 들어 col1만 있는 경우 col1 필드의 내용이 동일하면 레코드가 동일하다는 의미입니다.
c: 모든 분야를 판단한다
id1,id2,...별로 테이블 그룹에서 *를 #aa로 선택합니다.
테이블 삭제
테이블에 삽입
#aa에서 *를 선택하세요.
2. 기본키가 없는 상황
a: 임시 테이블을 사용하여 구현됨
ta에서 #temp로 ID(int,1,1)를 id로 선택하고*
#임시 삭제
아이디가 없는 곳
(
col1,col2,col3...별로 # 그룹에서 max(id)를 선택합니다.
)
테이블 삭제
ta(...)에 삽입
#temp에서 .....를 선택하세요.
b: 테이블 구조 변경(고유 필드 추가)을 통해 구현
테이블 변경 테이블에 newfield int ID 추가(1,1)
테이블 삭제
뉴필드가 없는 곳
(
newfield를 제외한 모든 필드로 테이블 그룹에서 min(newfield)을 선택하십시오.
)
테이블 변경 테이블 드롭 열 뉴필드