DB

SQL varray를 RDB에서 쓰는 법 - distinct, bit 연산

akinakamori 2024. 9. 4. 21:20
728x90
SMALL

rdb에서 배열을 저장하고 싶다면 어떻게 할까??

 

프로그래머스 sql문제에 좋은 예시가 있다

 

 

 

다른 테이블을 참조하여 모든 켜진 비트에 해당하는 ID를 찾으려면, 비트 연산을 활용하여 두 테이블을 JOIN해야 합니다. 이 경우, 한 테이블에는 ID와 비트 값(예: permissions), 다른 테이블에는 각 비트의 의미를 정의한 데이터가 포함됩니다.

예시 시나리오

  • USERS 테이블: 사용자 ID와 권한(비트 값)이 저장됨
  • PERMISSIONS 테이블: 각 비트의 의미를 정의한 테이블

테이블 정의

  1. USERS 테이블:
    • id: 사용자 ID
    • name: 사용자 이름
    • permissions: 비트로 표현된 권한 값
sql
코드 복사
CREATE TABLE USERS ( id INT PRIMARY KEY, name VARCHAR(50), permissions INT );
INSERT INTO USERS (id, name, permissions)
VALUES (1, 'Alice', 5), -- Binary: 101
(2, 'Bob', 2), -- Binary: 010
(3, 'Charlie', 7);-- Binary: 111
  1. PERMISSIONS 테이블:
    • bit_value: 각 비트를 나타내는 정수 값(1, 2, 4, 8, …)
    • description: 해당 비트가 의미하는 것
 
CREATE TABLE PERMISSIONS ( bit_value INT PRIMARY KEY, description VARCHAR(50) );
INSERT INTO PERMISSIONS (bit_value, description) VALUES (1, 'Can Edit'), (2, 'Can View'), (4, 'Can Delete');

켜진 비트에 해당하는 ID 찾기

USERS 테이블의 permissions 값이 PERMISSIONS 테이블의 bit_value와 일치하는 사용자 ID를 찾는 쿼리를 작성할 수 있습니다.

방법 1: JOIN과 WHERE 사용

이 방법은 USERS 테이블의 permissions 값이 PERMISSIONS 테이블의 각 bit_value에 대해 해당하는 사용자를 찾는 것입니다.

 
SELECT u.id, u.name, u.permissions, p.description
FROM USERS u
JOIN PERMISSIONS p ON u.permissions & p.bit_value = p.bit_value
ORDER BY u.id ASC, p.bit_value ASC;

설명

  • JOIN 구문:
    • USERS 테이블과 PERMISSIONS 테이블을 JOIN합니다. 여기서 조건은 u.permissions & p.bit_value = p.bit_value입니다.
    • 이 조건은 USERS 테이블의 permissions 값에서 p.bit_value 비트가 켜져 있는 사용자를 찾습니다.
  • 결과는 사용자의 ID, name, permissions 값과 그에 해당하는 비트의 설명(description)을 출력합니다.

결과 예시

예를 들어, 위의 데이터에서 Alice는 permissions = 5를 가지고 있습니다. 이는 이진수로 101이고, 첫 번째(1)와 세 번째(4) 비트가 켜져 있습니다. 따라서 결과는 Can Edit와 Can Delete 권한을 가진 사용자 Alice를 반환합니다.

 
+----+---------+-------------+-------------+
| id | name    | permissions | description |
+----+---------+-------------+-------------+
|  1 | Alice   |           5 | Can Edit    |
|  1 | Alice   |           5 | Can Delete  |
|  2 | Bob     |           2 | Can View    |
|  3 | Charlie |           7 | Can Edit    |
|  3 | Charlie |           7 | Can View    |
|  3 | Charlie |           7 | Can Delete  |
+----+---------+-------------+-------------+

정리

이 쿼리는 각 사용자의 permissions 값에서 켜진 비트에 해당하는 권한을 PERMISSIONS 테이블과 매칭하여 출력합니다. 이를 통해 어떤 사용자가 어떤 권한을 가지고 있는지 쉽게 확인할 수 있습니다.

 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/276034

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

조건에 맞는 개발자 찾기

 

- and 연산을 사용해풀 수 있다

- distinct를 깜빡해 자꾸 실패가 떴음

 

 

 

아래 코드

둘 다 가능

 

SELECT DISTINCT d.ID, d.EMAIL, d.FIRST_NAME, d.LAST_NAME
FROM DEVELOPERS d
INNER JOIN SKILLCODES s ON d.SKILL_CODE & s.CODE = s.CODE
WHERE s.NAME = 'PYTHON' OR s.NAME = 'C#'
ORDER BY d.ID ASC
;


# SELECT DISTINCT
#     d.ID, 
#     d.EMAIL, 
#     d.FIRST_NAME, 
#     d.LAST_NAME
# FROM 
#     DEVELOPERS d
# JOIN 
#     SKILLCODES s1 ON (d.SKILL_CODE & s1.CODE = s1.CODE)
# JOIN 
#     SKILLCODES s2 ON (d.SKILL_CODE & s2.CODE = s2.CODE)
# WHERE 
#     s1.NAME = 'Python'
#     OR 
#     s2.NAME = 'C#'
# ORDER BY 
#     d.ID ASC;
728x90
LIST

'DB' 카테고리의 다른 글

SQL null의 처리  (5) 2024.09.06
SQL CTE (Common Table Expression)  (0) 2024.09.05
SQL in  (0) 2024.09.04
SQL union all  (2) 2024.09.04