복붙노트

[SQL] 어떻게 데이터에 대한 상호 참조 테이블 / 쿼리를 만들려면 어떻게해야합니까?

SQL

어떻게 데이터에 대한 상호 참조 테이블 / 쿼리를 만들려면 어떻게해야합니까?

내 데이터베이스에 두 가지 간단한 테이블을 가지고있다. 카드의 판결을 자세히 ID, 이름, 카드의 텍스트 및 카드의 ID를 포함하는 "판결"테이블 및 텍스트가 포함 된 "카드"테이블.

자주 집권 텍스트, 데이터베이스에있는 다른 카드에 대한 참조가 있습니다. 각각의 카드가 텍스트에서 따옴표 내에 캡슐화되어 있기 때문에 텍스트에서이 문제를 쉽게 찾을 충분하다. 이 판결의 텍스트 내에서 참조 여러 카드를 가지고하는 것은 드문 일이 아니다.

내가 뭘하려는 (충분히 효율적인 경우 또는 절차) 내가 카드에 대한 쿼리를 제출할 때, 그래서 내가 직접을 통해 카드를 참조하는 모든 집권 기록을 찾을 수있는 상호 참조 테이블을 생성 할 수있다 이드 카드 이름이 텍스트에서 참조 집권 기록을 모두 얻을.

이 접근하는 가장 좋은 방법이 있을까요? 내 환경은 SQL 2005,하지만 "DB 불가지론"솔루션의 종류는 크게 여기에 사용할 수 있습니다.

해결법

  1. ==============================

    1.이것은 상호 참조 테이블에 의해 해결된다 상당히 간단하고 일반적인 관계 문제처럼 보인다. 예를 들면 :

    이것은 상호 참조 테이블에 의해 해결된다 상당히 간단하고 일반적인 관계 문제처럼 보인다. 예를 들면 :

    CREATE TABLE dbo.Cards (
        id        INT            NOT NULL,
        name      VARCHAR(50)    NOT NULL,
        card_text VARCHAR(4000)  NOT NULL,
        CONSTRAINT PK_Cards PRIMARY KEY CLUSTERED (id)
    )
    GO
    CREATE TABLE dbo.Card_Rulings (
        card_id        INT            NOT NULL,
        ruling_number  INT            NOT NULL,
        ruling_text    VARCHAR(4000)  NOT NULL,
        CONSTRAINT PK_Card_Rulings PRIMARY KEY CLUSTERED (card_id, ruling_number)
    )
    GO
    CREATE TABLE dbo.Card_Ruling_Referenced_Cards (
        parent_card_id    INT    NOT NULL,
        ruling_number     INT    NOT NULL,
        child_card_id     INT    NOT NULL,
        CONSTRAINT PK_Card_Ruling_Referenced_Cards PRIMARY KEY CLUSTERED (parent_card_id, ruling_number, child_card_id)
    )
    GO
    ALTER TABLE dbo.Card_Rulings
    ADD CONSTRAINT FK_CardRulings_Cards FOREIGN KEY (card_id) REFERENCES dbo.Cards(id)
    GO
    ALTER TABLE dbo.Card_Ruling_Referenced_Cards
    ADD CONSTRAINT FK_CardRulingReferencedCards_CardRulings FOREIGN KEY (parent_card_id, ruling_number) REFERENCES dbo.Card_Rulings (card_id, ruling_number)
    GO
    ALTER TABLE dbo.Card_Ruling_Referenced_Cards
    ADD CONSTRAINT FK_CardRulingReferencedCards_Cards FOREIGN KEY (child_card_id) REFERENCES dbo.Cards(id)
    GO
    

    카드의 모든 카드 판결을 얻으려면 :

    SELECT *
    FROM dbo.Cards C
    INNER JOIN dbo.Card_Rulings CR ON CR.card_id = C.id
    WHERE C.id = @card_id
    

    주어진 카드로 판결에서 참조하는 모든 카드를 얻으려면 :

    SELECT C.*
    FROM dbo.Card_Rulings CR
    INNER JOIN dbo.Card_Ruling_Referenced_Cards CRRC ON CRRC.parent_card_id = CR.card_id
    INNER JOIN dbo.Cards C ON C.id = CRRC.child_card_id
    WHERE CR.card_id = @card_id
    

    이 내 머리 위로 떨어져 모든이었고, 테스트되지 않으므로 등의 구문 오류가있을 수 있습니다

    프런트 엔드는 참조를 유지할 책임이 될 것이다. 그것은 지배 텍스트 등의 카드 이름 주위에 따옴표를 넣어 잊는 사람의 문제를 피할 수 있기 때문에 이것은 아마도 바람직하다

  2. ==============================

    2.나는 당신이 당신의 참조를 저장하는 다른 테이블을 만드는 것이 좋습니다 것입니다. 그런 다음,이 테이블을 유지하는 삽입 및 업데이트 트리거를 만들 수 있습니다. 이런 식으로, 당신은 당신이 찾고있는 데이터를 반환하는 빠른 쿼리를 할 것입니다.

    나는 당신이 당신의 참조를 저장하는 다른 테이블을 만드는 것이 좋습니다 것입니다. 그런 다음,이 테이블을 유지하는 삽입 및 업데이트 트리거를 만들 수 있습니다. 이런 식으로, 당신은 당신이 찾고있는 데이터를 반환하는 빠른 쿼리를 할 것입니다.

    나는 처음에이 테이블을 채우는 것은 당신이 당신이 시작하는 데 사용할 수있는 아래의 몇 가지 예제 데이터를 표시 (쿼리)입니다 이유입니다, 조금 어려울 수도 있음을 인식하고 있습니다.

    Declare @Card Table(Id Int, Name VarChar(20), CardText VarChar(8000))
    
    Declare @Ruling Table(CardId Int, CardRuling VarChar(8000))
    
    Insert Into @Card Values(1, 'Card 1', 'This is the card ID = 1')
    Insert Into @Card Values(2, 'Card 2', 'This is the card id = 2.')
    Insert Into @Card Values(3, 'Card 3', 'This is the card id = 3.')
    
    Insert Into @Ruling Values(1, 'This is the ruling for 1 which references "2"')
    Insert Into @Ruling Values(2, 'This is the ruling for 2 which references nothing')
    Insert Into @Ruling Values(3, 'This is the ruling for 3 which references "1" and "2"')
    
    Declare @CardId Int
    Set @CardId = 1
    
    Select  * 
    From    @Card As Card
            Inner Join @Ruling As Ruling
                On Card.Id = Ruling.CardId
            Left Join @Card As CardReferences
                On Ruling.CardRuling Like '%"' + Convert(VarChar(10), CardReferences.Id) + '"%'
    

    편집하다:

    당신이 가능성이 특히 큰 테이블이 쿼리의 성능에 실망 될 것입니다 때문에 다른 테이블을 제안하는 이유입니다.

  3. from https://stackoverflow.com/questions/321127/how-do-i-create-a-cross-reference-table-query-for-my-data by cc-by-sa and MIT license