2012-09-20 3 views
0

J'ai cette requête:Changing IS NULL avec (+) Syntaxe

SELECT B.id, B.name, D.id, D.name FROM TBB B, TDD D 
WHERE (D.id = B.id OR D.id IS NULL) 

D'après ce que je pensais, (D.id = B.id OR D.id IS NULL) montrera record qui ont id dans les deux TBB de table et TDD l'mais aussi montrer tous B.id records même si les deux table ne possède pas le même identifiant à cause de D.id IS NULL

Alors, est-ce le même que ma requête ci-dessus:

SELECT B.id, B.name, D.id, D.name FROM TBB B, TDD D 
    WHERE B.id = D.id (+) 

Merci d'avance!

+0

Oui, c'est équivalent. Ne pouvez-vous pas simplement courir et voir qu'il renvoie le même resultset? – alfasin

+0

Eh bien alors je le fais bien, Suis-je? – RedFux227

Répondre

0

Je suis à peu près sûr que votre requête supérieure aboutirait à une jointure cartésienne à chaque enregistrement dans B pour les enregistrements qui ont une valeur NULL en raison de l'instruction or dans votre requête. En fonction de cela, il serait préférable d'utiliser la jointure externe.

J'ai aussi écrit un Q & long A qui regarde et comment les jointures extraire des données de plusieurs tables vous pourriez être intéressé par (How can an SQL query return data from multiple tables) couvre les syndicats, intérieur et extérieur se joint ainsi que les sous-requêtes. Il a charges de code et les résultats de sortie qui sont expliqués en détail. (Au point je frappe la limite de longueur de réponse, donc dû poster une deuxième réponse)

Edit: Après l'exécution d'un test rapide, ce que je viens avec:

mysql> select a.ID, a.Title, b.Name as Author 
    from books a join authors b 
    on a.authorID=b.ID or b.id=0; 

    +----+----------------------+-------------------+ 
    | ID | Title    | Author   | 
    +----+----------------------+-------------------+ 
    | 1 | Call of the Wild  | Fluffeh   | 
    | 1 | Call of the Wild  | Jack London  | 
    | 2 | Martin Eden   | Fluffeh   | 
    | 2 | Martin Eden   | Jack London  | 
    | 3 | Old Goriot   | Fluffeh   | 
    | 3 | Old Goriot   | Honore de Balzac | 
    | 4 | Cousin Bette   | Fluffeh   | 
    | 4 | Cousin Bette   | Honore de Balzac | 
    | 5 | Jew Suess   | Fluffeh   | 
    | 5 | Jew Suess   | Lion Feuchtwanger | 
    | 6 | Nana     | Fluffeh   | 
    | 6 | Nana     | Emile Zola  | 
    | 7 | The Belly of Paris | Fluffeh   | 
    | 7 | The Belly of Paris | Emile Zola  | 
    | 8 | In Cold blood  | Fluffeh   | 
    | 8 | In Cold blood  | Truman Capote  | 
    | 9 | Breakfast at Tiffany | Fluffeh   | 
    | 9 | Breakfast at Tiffany | Truman Capote  | 
    +----+----------------------+-------------------+ 
    18 rows in set (0.00 sec) 

    mysql> select a.ID, a.Title, b.Name as Author 
    from books a right outer join authors b 
    on a.authorID=b.ID; 
    +------+----------------------+-------------------+ 
    | ID | Title    | Author   | 
    +------+----------------------+-------------------+ 
    | NULL | NULL     | Fluffeh   | 
    | 1 | Call of the Wild  | Jack London  | 
    | 2 | Martin Eden   | Jack London  | 
    | 3 | Old Goriot   | Honore de Balzac | 
    | 4 | Cousin Bette   | Honore de Balzac | 
    | 5 | Jew Suess   | Lion Feuchtwanger | 
    | 6 | Nana     | Emile Zola  | 
    | 7 | The Belly of Paris | Emile Zola  | 
    | 8 | In Cold blood  | Truman Capote  | 
    | 9 | Breakfast at Tiffany | Truman Capote  | 
    +------+----------------------+-------------------+ 
    10 rows in set (0.00 sec) 

Ce qui est certainement pas la même chose qu'une jointure externe. Comme je le pensais (au moins en MySQL) les résultats cartésiens dans la première déclaration, mais pas dans la jointure externe.

+0

Hmm, La valeur NULL est attachée à la lettre D, n'est-ce pas? – RedFux227

+0

Oui, mais comme il y a une instruction OR dans la clause 'where', celles de la section' D is null' ne sont pas jointes sur un champ particulier et je pense qu'il va correspondre à toutes les lignes de D qui ont la valeur NULL Chaque rangée de B. Cela dit, qu'est-ce que vous obtenez quand vous l'exécutez? – Fluffeh

+0

Mais j'utilise() sur ma condition where. N'est-ce pas aidé à grouper la condition où? – RedFux227

1

la deuxième requête retournera toute la ligne existante dans la table TBB, la colonne non correspondante dans la table TDD retournera NULL.

La table TDD dans le cas a n'importe quel ID qui ne correspond pas à l'ID de table TBB, cette ligne ne retournera pas au-dessus de deux requêtes.

+0

Donc, ma supposition pour la première requête est juste alors? – RedFux227

+0

pour votre première requête, en réalité les valeurs nulles simples dans la table TDD correspondront à chaque ligne unique dans la table TBB. – solaimuruganv