출처 : http://www.webmadang.net/database/database.do?action=read&boardid=4001&page=null&seq=5

[MSSQL - GROUP BY HAVING 을 이용한 중복 데이타 체크]



1 - 단일 테이블에서 GROUP BY HAVING 을 이용한 중복 데이타 체크

아래와 같은 로그인 정보를 기록하는 9개의 레코드를 가진 테이블이 있다고 가정하겠습니다. 테이블의 이름은
"loginLog_tbl" 이고 로그인 로그(log)를 기록해야 하니 당연히 중복된 데이타가 들어가 있을것입니다. 

위 테이블의 레코드를 보면 mfcchang이라는 uid가 3회나 로그인 했다는 것을 알 수 있습니다. 레코드의 갯수가 작아서
눈으로도 파악이 되지만 레코드의 갯수가 많을때는 다음과 같은 쿼리문으로 간편하게 파악 할 수도 있습니다.

SELECT uid, count(*) AS loginCount FROM loginLog_tbl GROUP BY uid ORDER BY loginCount DESC

위와 같은 쿼리를 실행해보면 GROUP BY 에 의해서 uid 컬럼의 count가 집계되고 결과는 아래와 같습니다.

 

여기에 Having 절의 제약조건을 이용해서 loginCount가 1 보다 큰것만 출력해 보겠습니다. loginCount 는 count(*)의 엘리어스 이니까, Having 절 이하는 아래와 같을 것입니다.

SELECT uid, count(*) AS loginCount FROM loginLog_tbl GROUP BY uid HAVING count(*) > 1

출력해 보면 결과는 아래와 같습니다. 아래의 결과에서 두번 즉 2회 이상 로그인한 사람은 kimchi 와 mfcchang 이라는 uid의 소유자 뿐임을 알수 있습니다.

 

어떠한 경우에서든 데이타의 중복을 확인하고자 한하면 바로 위의 쿼리문을 이용하시면 됩니다. 중복을 체크하고자 하는 
기준이 되는 컬럼만 바꾸면 될 것입니다.



2 - 두개 이상의 테이블에서 GROUP BY HAVING 을 이용한 중복 데이타 체크 

그렇다면 중복을 체크하고자 하는 컬럼이 위와 같이 테이블이 하나가 아니고 둘또는 셋이상에 걸쳐서 존재한다면 어떻게
처리하면 될까요? 테이블간에 합집합의 결과를 모두 보여주는 UNION ALL 로 테이블을 결합하시면 됩니다.

아래와 같이 로그인 정보를 기록하는 테이블이 하나 더 있고, 이 테이블은 예전에 퇴사한 선임자가 만들어 놓은 것이라고 
가정하겠습니다. 테이블의 이름은 loginLogTABLE 입니다.

 

처음에 사용했던 loginLog_tbl과 바로 위의 logLogTABLE에서 uid 컬럼의 데이타값이 2 개 이상인 것을 찾아내는
쿼리는 아래와 같습니다.

SELECT uid, count(*) AS loginCount FROM 
SELECT uid FROM loginLog_tbl UNION ALL SELECT uid FROM loginLogTABLE ) AS T
GROUP BY uid HAVING count(*) > 1

하나의 테이블을 사용할때와 틀린부분은 UNION ALL 로 해당 테이블을 묶어서 서브쿼리로 처리한다는 것뿐입니다.
결과는 아래와 같습니다. 두개의 테이블의 레코드 갯수가 몇개 없으니 눈으로도 확인 가능할 것입니다.

작성자: 다자래(mfcchang@naver.com) 
웹제작 토탈 커뮤니티 http://www.webmadang.net


출처 : http://mrdingku.tistory.com/41


앞의 글(SQL Server Management Studio를 사용해서 연결된 서버를 등록하기)을 따라 연결된 서버를 등록했다


이제 SQL Server에서 연결된 서버의 Table을 OpenQuery를 이용하여 조회하고 등록하고 수정하고 삭제해보겠다.


## Select

1
SELECT * FROM OPENQUERY(L_TESTDB, 'SELECT * FROM LinkedServerTestTable');


## Insert

1
INSERT OPENQUERY(L_TESTDB, 'SELECT NO, NAME FROM LinkedServerTestTable ') VALUES (1, '홍길동');


## Update

1
UPDATE OPENQUERY(L_TESTDB, 'SELECT NAME FROM LinkedServerTestTable WHERE NO = 1') SET NAME = '임꺽정';


## Delete

1
DELETE FROM OPENQUERY(L_TESTDB, 'SELECT NO FROM LinkedServerTestTable WHERE NO = 1');


어렵지않다. 찾으면 쉽게 알 수 있다.

공부하자~~!!!!


########## 추가 ##########

프로시저에서 openquery를 이용하여 update하는데, where절에 NO = @P_NO 파라미터를 넣었더니 바로 에러가 나더라는.....

그래서 확인해보니 openquery에는 string 만들어가야 한다는 사실을 알게 되었다.. 그놈 참... 까다롭네그려... ㅡㅡ;;;


그래서


1
2
3
4
5
@_QUERY = '
UPDATE OPENQUERY(L_TESTDB, 'SELECT NAME FROM LinkedServerTestTable WHERE NO = '+@SMS_SEQ+'')
      SET NAME = '''+@NAME+'' '
 
Execute sp_executesql  @_QUERY, @_PARAMS


주의사항 : 파라미터 부분에 작은 따옴표 " ' "를 넣을때 특수문자여서 하나더 넣어야한다는거 다들 아시지요?? 

@SMS_SEQ가 스트링일 경우, '''''+@SMS_SEQ+''''' 요렇게...

This is very common request recently – How to import CSV file into SQL Server? How to load CSV file into SQL Server Database Table? How to load comma delimited file into SQL Server? Let us see the solution in quick steps.

CSV stands for Comma Separated Values, sometimes also called Comma Delimited Values.

Create TestTable

USE TestData
GO
CREATE TABLE CSVTest
(ID INT,
FirstName VARCHAR(40),
LastName VARCHAR(40),
BirthDate SMALLDATETIME)
GO

Create CSV file in drive C: with name csvtest.txt with following content. The location of the file is C:\csvtest.txt

1,James,Smith,19750101

2,Meggie,Smith,19790122

3,Robert,Smith,20071101

4,Alex,Smith,20040202

Now run following script to load all the data from CSV to database table. If there is any error in any row it will be not inserted but other rows will be inserted.

BULK
INSERT 
CSVTest
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR ',',
ROWTERMINATOR '\n'
)
GO
--Check the content of the table.
SELECT *
FROM CSVTest
GO
--Drop the table to clean up database.
SELECT *
FROM CSVTest
GO

Reference : Pinal Dave (http://blog.SQLAuthority.com)

1.SELECT * INTO사용법

   SELECT  INTO 구문은 원본은 있고 대상 테이블은 새롭게 생성하려 할 경우 사용합니다.

   TABLE A에서 모든 데이터를 가져와 A_COPY라는 테이블을 생성하여 데이터를 INSERT하고 싶습니다.

   물론 A_COPY라는 테이블은 현재 만들어져있지 않습니다.

 

   SELECT * INTO A_COPY FROM A

 

   위와 같이 하면 A테이블과 같은 컬럼과 데이터를 가지는 A_COPY라는 테이블이 생성됩니다.

   그럼 A테이블의 특정 컬럼만 가져오려면?

 

   SELECT * INTO A_COPY

   FROM (

              SELECT COL1,COL2,COL3.... FROM A 

             ) AS TEMP_TABLE

   위와 같이 하면 A테이블의 특정 컬럼만 가져와서 A_COPY라는 테이블을 생성하여 데이터를 INSERT합니다.

 

2.INSERT INTO SELECT 사용법

   INSERT INTO 구문은 원본과 대상테이블이 모두 있을 경우 사용합니다.

   TABLE A에서 모든 데이터를 가져와 B라는 테이블에 INSERT 하고 싶습니다.

  

   INSERT INTO B SELECT * FROM A

   위에서 TABLE A와 TABLE B는 스키마가 동일해야 합니다.

 

   만일 A보다 컬럼수가 적을 경우에는

   INSERT INTO B SELECT COL1,COL2,COL3 FROM A

   와 같이 사용할 수 있습니다.

출처 : http://smlim.tistory.com/189



간혹 이런 경우가 있다 칼럼명을 알고 있는데 테이블 명을 모를때 

이런 경우 테이블 명을 찾을 수 있는 쿼리문이 있다

select OBJECT_NAME(id) from sys.syscolumns where name='컬럼명'

+ Recent posts